# 類對象以及類實例的創建過程
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()