类对象以及类实例的创建过程

# 类对象以及类实例的创建过程
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()

转载于:https://www.cnblogs.com/DcentMan/p/11307253.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值