自定義元類和元類的用途
阿新 • • 發佈:2018-12-05
# -*- 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