zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Arthas线上问题排查
    如何快速增加pdf书签,解除pdf限制
    数组指针——指向数组的指针(通过指针控制数组)
    指针和数组直接对应关系之如何记忆
    C/C++语言中指针数组和数组指针比较区别
    int最大值+1为什么是-2147483648最小值-1为什么是2147483647
    电脑进行二进制加减运算方法
    C/C++语言中的函数参数传参三种对比
    Python基于VS2013 开发环境搭建 Hello World 10分钟搞定
    算法的复杂度包括时间复杂度和空间复杂度分别如何计算?
  • 原文地址:https://www.cnblogs.com/aadmina/p/11069091.html
Copyright © 2011-2022 走看看