類對象以及類實例的創建過程

# 類對象以及類實例的創建過程 class AnimalMeta(type): def __new__(cls, *args, **kwargs): print("=======>AnimalMeta__new__%s"%cls) return type.__new__(cls,*args,**kwargs) def __init__(self,*args,**kwargs): print("=======>AnimalMeta__init__%s"%self) def __call__(self, *args, **kwargs): print("=======>AnimalMeta__call__%s" % self) return type.__call__(self,*args,**kwargs) class Animal(metaclass=AnimalMeta): def __new__(cls, *args, **kwargs): print("=======>Animal__new__%s" % cls) return object.__new__(cls, *args, **kwargs) def __init__(self): print("=======>Animal__init__%s" % self) def __call__(self, *args, **kwargs): print("=======>Animal__call__%s" % self) class PersonMeat(type): def __new__(cls, *args, **kwargs): # 用於實現類對象的創建,根據返回值的不同創建不同的類對象,也就是說類對象是由返回值來決定的 # 不過這里必須是type的子類對象 print("=======>PersonMeat__new__%s"%cls) return type.__new__(cls,*args,**kwargs) # return type.__new__(AnimalMeta,*args,**kwargs)#通過其他原類的子類來創建類對象 # return AnimalMeta(*args,**kwargs) def __init__(self,*args,**kwargs): # 用於實現給類對象進行屬性以及方法的賦值 print("=======>PersonMeat__init__%s"%self) def __call__(self, *args, **kwargs): # 實現類實例的創建,self是類對象,先調用類對象的__new__方法,根據__new__對象的返回值 # 實現對不同類實例的__init__方法的調用以完成類實例的屬性的賦值 print("=======>PersonMeat__call__%s" % self) return type.__call__(self,*args,**kwargs) # return type.__call__(Animal,*args,**kwargs) # return Animal(*args,**kwargs) class Persion(metaclass=PersonMeat): def __new__(cls, *args, **kwargs): # 實現類實例的創建 print("=======>Persion__new__%s" % cls) return object.__new__(cls,*args,**kwargs) # return object.__new__(Animal,*args,**kwargs) # return Animal() def __init__(self): # 實現類實例的屬性的賦值 print("=======>Persion__init__%s" % self) def __call__(self, *args, **kwargs): print("=======>Persion__call__%s" % self) ''' 創建類實例過程: 1、先通過類的原類的__new__方法來創建類對象 2、在通過類的原類的__init__方法來實現對類對象的屬性以及方法的賦值 3、通過調用類的原類的__call__方法來實現對類對象的__new__方法以及__init__方法的調度 4、調用類對象的__new__方法實現類的實例 5、調用類對象的__init__方法實現類實例的屬性以及方法的賦值 ''' # p = Persion()