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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM