python类对象及类实例的创建过程
作者:互联网
类对象以及类实例的创建过程
# 类对象以及类实例的创建过程 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()View Code
标签:__,__%,及类,python,self,args,实例,kwargs,new 来源: https://www.cnblogs.com/aadmina/p/11069091.html