1. 程式人生 > >自定義元類和元類的用途

自定義元類和元類的用途

# -*- coding:UTF-8 -*-
__autor__ = 'zhouli'
__date__ = '2018/12/3 23:13'


def create_class(name):
    if name == "user":
        class User:
            def __str__(self):
                return "user"

        return User  # 這一步很關鍵一定要把類給return回去
    elif name == "company":
        class Company:
            
def __str__(self): return "company" return Company if __name__ == "__main__": MyClass = create_class("user") my_obj = MyClass() print(my_obj)

結果是user,這個就是動態的創建出來的類。

不過在此做一個補充說明:很多人不明白為什麼使用

if __name__ == "__main__":

因為這樣會保證這個指令碼被呼叫時候不會被自動執行

但這樣動態的建立類也不是太靈活,那就可以採用type類了

type一般用來獲取某一個物件的型別的,第二點就是type可以用來建立類的

如何動態的建立類呢?

# -*- coding:UTF-8 -*-
__autor__ = 'zhouli'
__date__ = '2018/12/3 23:25'
# type動態建立類
#  User = type("User", (), {})
# 第一個引數傳遞的是類的名稱,第二個引數是繼承的基類,不繼承直接寫個空元祖,第三個引數是傳入屬性,不寫傳一個空字典


if __name__=="__main__":
    User = type("User", (), {})
    my_obj = User()
    
print(my_obj) """ <__main__.User object at 0x025A4A50> """

為User新增屬性

if __name__=="__main__":
    User = type("User", (), {"name":"user"})
    my_obj = User()
    print(my_obj.name)
"""
user
"""

這個就和

# -*- coding:UTF-8 -*-
__autor__ = 'zhouli'
__date__ = '2018/12/3 23:13'


def create_class(name):
    if name == "user":
        class User:
            name = "user"

            def __str__(self):
                return "user"

        return User  # 這一步很關鍵一定要把類給return回去
    elif name == "company":
        class Company:
            def __str__(self):
                return "company"

        return Company


if __name__ == "__main__":
    MyClass = create_class("user")
    my_obj = MyClass()
    print(my_obj.name)

是一樣的了

但是我們建立類的時候不僅僅有類的屬性,實際還有類的方法,那如何定義呢?

很簡單:定義一個函式,記住引數一定要是self:

def say(self):
    return "i am user"
    # return self.name

然後在屬性中加入{"say": say}

完整如下:

def say(self):
    # return "i am user"
    return self.name + 'test'


if __name__ == "__main__":
    User = type("User", (), {"name": "user", "say": say})  # 是函式的名稱,不是呼叫,不要加()
    my_obj = User()
    print(my_obj.say())
"""
usertest
"""

那如果User需要繼承一個基類呢?

class BaseClass:
    def answer(self):
        return '****'


if __name__ == "__main__":
    User = type("User", (BaseClass,), {"name": "user", "say": say})  # 是函式的名稱,不是呼叫,不要加()
    my_obj = User()
    print(my_obj.answer())
"""
****
"""

別忘了元祖後的一個逗號

那什麼才是元類?

元類是建立類的類

編碼時很少會採用type建立類,一般使用MetaClass(type)類名可以自定義,但繼承type了他就是元類了

class MetaClass(type):
    def __new__(cls, *args, **kwargs):
        return super().__new__(cls, *args, **kwargs)


from collections.abc import *


# 什麼是元類, 元類是建立類的類 物件<-class(物件)<-type
class User(metaclass=MetaClass):  # 指定控制例項化過程的元類
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return "user"


# python中類的例項化過程,會首先尋找metaclass,通過metaclass去建立user類
# 去建立類物件,例項

類什麼也不繼承的時候,type會去建立類物件,例項。

 

那麼元類到底有什麼作用呢?

例:自定義ORM