1.建立類時先執行type的__init__方法,
2.當一個類實例化時(建立一個對象)執行type的__call__方法,__call__方法的返回值就是實例化的對象
__call__內部調用
-類.__new__方法,建立一個對象
-類.__init__方法,初始化對象
實例化對象是誰取決於__new__方法,__new__返回什麼就是什麼
__new__() 方法的特性:
class Foo(object): pass obj=Foo() #默認是調用該類的直接父類的__new__()方法來構造該類的實例
print(obj) #打印結果:<__main__.Foo object at 0x000002636FEAA208>
事實上若是(新式)類中沒有重寫__new__()方法,即在定義新式類時沒有從新定義__new__()時,Python默認是調用該類的直接父類的__new__()方法來構造該類的實例,
若是該類的父類也沒有重寫__new__(),那麼將一直按此規矩追溯至object的__new__()方法,由於object是全部新式類的基類。 class F1(object):
#重寫__new__方法,返回這個重寫的__new__方法 def __new__(cls, *args, **kwargs): return 123 obj=F1() #實例化對象是誰取決於__new__方法,__new__返回什麼就是什麼 print(obj,type(obj)) #打印結果:123 <class 'int'> class F2(object): pass class F3(object): def __new__(cls, *args, **kwargs): return F2() obj=F3() #實例化對象是誰取決於__new__方法,__new__返回什麼就是什麼 print(obj) #<__main__.F2 object at 0x00000210119BA4A8>
def __new__(cls, *args, **kwargs): ... return object.__new__(cls)
__new__
至少要有一個參數cls,表明要實例化的類,此參數在實例化時由Python解釋器自動提供spa
__new__
必需要有返回值,返回實例化出來的實例,這點在本身實現__new__
時要特別注意,能夠return父類__new__
出來的實例,或者直接是object的__new__
出來的實例code
__init__
有一個參數self,就是這個__new__
返回的實例,__init__
在__new__
的基礎上能夠完成一些其它初始化的動做,__init__
不須要返回值對象