• 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
  • 相关阅读:
    idea设置全局ignore
    win 2012 安装mysql 5.7.20 及报错 This application requires Visual Studio 2013 Redistributable. Please ins
    win 2012 安装mysql 5.7.20 及报错 This application requires Visual Studio 2013 Redistr
    kafka 删除 topic
    java编译中出现了Exception in thread “main" java.lang.UnsupportedClassVersionError
    Centos中使用yum安装java时,没有jps的问题的解决
    Spring 整合Junit
    Spring纯注解配置
    Spring 基于注解的 IOC 配置
    打印java系统的信息
  • 原文地址:https://www.cnblogs.com/aadmina/p/11069091.html
Copyright © 2020-2023  润新知