標籤:__new__ base 通過 引用 value __init__ 文章 ## object
看了一篇文檔,借鑒一下!寫下自己對python元類的理解,歡迎各位大神給出意見。
我的理解就是
type用來建立元類,元類用來建立類,類用來建立執行個體
這樣一想,是不是可以認為元類建立類的過程等同於類建立執行個體,類建立不同的執行個體,雖然每個執行個體都有類似的屬性,方法,但具體都是不一樣的!
class Fruits(): def __init__(self,name,color): self.name=name self.color=color def __new__(cls,name,color): return object.__new__(cls)apple=Fruits(‘apple‘,‘red‘)print(apple.name)print(apple.color)banana=Fruits(‘banana‘,‘yellow‘)print(banana.name)print(banana.color)
類的兩個執行個體apple,banana都有同樣的屬性name,age,但是各自的值確實不同的,都屬於水果類,但卻是不同的水果。。
再來看元類定製類的過程,直接引用大神的代碼吧
元類建立類的過程中也可以認為是每個類都有相同的地方(比如都是一個元類建立,都有共同的Fu類),也有各自不同的地方(每個類的類名不同,實現的方法也不同)
# 猜想,類中的new方法是用來建立執行個體的# 元類的new方法是用來建立類的?# 道生一:傳入typeclass SayMetaClass(type): # 傳入三大永恒命題:類名稱、父類、屬性 def __new__(cls, name, bases, attrs): print("test, new is running!") # 創造“天賦” attrs[‘say_‘ + name] = lambda self, value, saying=name: print(saying + ‘,‘ + value + ‘!‘) # 傳承三大永恒命題:類名稱、父類、屬性 return type.__new__(cls, name, bases, attrs)#########Hello類# 一生二:建立類class Hello(object, metaclass=SayMetaClass): pass# 二生三:建立實列hello = Hello()# 三生萬物:調用執行個體方法hello.say_Hello(‘world!‘)#########Nihao類# 一生二:建立類class Nihao(object, metaclass=SayMetaClass): pass# 二生三:建立實列nihao = Nihao()# 三生萬物:調用執行個體方法nihao.say_Nihao(‘world!‘)
這就是一個元類建立類的過程,通過class Hello(object, metaclass=SayMetaClass): 建立類,在建立的時候調用了元類的__new__方法(這裡似乎發現一個通性:類的new方法用來建立執行個體,元類的new方法用來建立類)通過這個元類的new方法建立了類Hello跟Nihao,Hello擁有私人定製的say_**方法,是不是跟類的執行個體有點類似,這樣理解起來感覺簡單多了。。
文章連結:http://python.jobbole.com/88795/
理解python的元類