1.1 什麼是元類
元類就是用來建立類的『東西』
python中類也是一種物件
#定義乙個類
# python直譯器在執行的時候會建立乙個物件
class ai(object):
pass
print(type(ai))
#
1.2 使用type建立類
type可以動態的建立類
type(類名,由父類名組成的元組,屬性字典)
ai = type("ai", (), )
print(ai)
print(ai.__class__)
a1 = ai()
print(a1.__class__)
#npc繼承ai
npc = type("npc", (ai,), )
print(npc)
print(npc.__bases__)
print(npc.hp)
# # # # # (,)
# 100
1.3 自定義元類
元類的呼叫:
class npc(ai):
pass
python在建立npc類時先不在記憶體中建立、首先檢視npc中有__metaclass__這個屬性嗎 如果有,python會通過__metaclass__
建立乙個名字為npc的類(物件) 如果python沒有找到__metaclass__,它會繼續在ai(父類)中尋找__metaclass__屬性,並嘗
試做和前面同樣的操作。 如果python在任何父類中都找不到__metaclass__,它就會在模組層次中去尋找__metaclass__,並嘗
試做同樣的操作。 如果還是找不到__metaclass__,python就會用內建的type來建立這個類物件
def renameattribute(classname, parentclass, attributedic):
newattribute = {}
for key, value in attributedic.items():
if not key.startswith("__"):
key = classname.lower() + key
newattribute[key] = value
for key, value in newattribute.items():
print(key, value)
return type(classname, parentclass, newattribute)
class ai(object, metaclass=renameattribute):
isalive = false
ai = ai()
print(hasattr(ai, "isalive")) #false
print(hasattr(ai, "aiisalive")) #true
1.4 使用元類的好處
攔截類的建立
修改類返回修改後的類
Python高階之 元類
幾個魔術方法 new init call new 物件的建立,是乙個靜態方法,第乙個引數是cls 想想也是,不可能是self,物件還沒建立,哪來的self init 物件的初始化,是乙個例項方法,第乙個引數是self call 物件可call,注意不是類,是物件。class bar object d...
Python高階程式設計 元類程式設計
class people def init self,name self.name name property defname self return self.name name.setter defname self,value self.name value getattr 是在找不到屬性的時...
Python基礎到高階 元類metaclass
一切源自於一句話 python中一切皆為物件。讓我們先定義乙個類,然後逐步分析 class oldboyteacher object school oldboy def init self,name,age self.name name self.age age defsay self print ...