進一步認識__new__和__call__,認識__new___call_
1.關於__init__
class F00(object):
def __init__(self,name):
self.name = name
print("Foo--init--")
def __new__(cls, *args, **kwargs):
print("Foo--new--")
return object.__new__(cls)#cls表示將Foo類傳進__new__方法中,表示繼父類的__new__方法
f= F00("name")
#當存在return object.__new__(cls)時,先後輸出Foo--new--和Foo--init--,說明__new__執行在__init__之前
#當去掉return object.__new__(cls)時,只輸出Foo--new--,說明__init__執行個體時沒有被執行個體
#總結:__new__方法是類裡面內建的,new是使用者來建立執行個體的,預設不寫,可以重寫
#作用:在執行個體化時會先於__init__執行,我們想在執行個體化之前
2.關於__call__
class MyType(type):
def __init__(self,what,bases=None,dict=None):
super(MyType, self).__init__(what,bases,dict)
def __call__(self, *args, **kwargs):
obj=self.__new__(self,*args, **kwargs)
self.__init__(obj)
class Foo(object):#底層是通過MyType類的 __init__方法實現的
__metaclass__ =MyType
def __init__(self,name):#底層是通過MyType類的__call__方法的self.__init__(obj)實現的
self.name = name
def __new__(cls, *args, **kwargs):
return object.__new__(cls)#底層是通過MyType類的__call__方法的obj=self.__new__(self,*args, **kwargs)實現的
obj=Foo("name")#執行建立Foo的執行個體其實是執行MyType類的__call__方法
#__call__作用時用於建立__new__的