python类对象创建流程

类对象创建流程

# @charset "utf-8"
# @author Redskaber
# @Filename _3_metaclass创建类型_new_init_call_.py
# @time 2022/8/6/16:58


# mcs <=> make_class
# cls <=> class
class MyType(type):

    def __init__(cls, *args, **kwargs):
        print('MyType.__init__ MyType初始化Foo类型空对象(赋值)')
        super(MyType, cls).__init__(*args, **kwargs)

    def __new__(mcs, *args, **kwargs):
        make_class = super(MyType, mcs).__new__(mcs, *args, **kwargs)
        print('MyType.__new__ MyType创建Foo类型空对象:', make_class)
        return make_class

    def __call__(cls, *args, **kwargs):
        print('MyType.__call__ MyType执行Foo类型对象:', cls)
        # 1. 调用由MyType元类创建的类型的__new__方法,创建类型实例化空对象
        empty_object = cls.__new__(cls)
        print('MyType元类调用Foo.__new__ 创建Foo类型的实例化空对象:', empty_object)
        # 2. 调用由MyType元类创建的类型的__init__方法,为类型实例化对象赋值(初始化)
        cls.__init__(empty_object, *args, **kwargs)
        print('MyType元类调用Foo.__init__ 赋值Foo类型的实例化空对象:', empty_object)
        return empty_object


# Foo 类型本质上是由MyType元类创建的一个对象
# Foo()  ->  MyType对象() -> 执行MyType.__call__方法
class Foo(metaclass=MyType):

    def __init__(self, name):
        print('Foo类型,初始化Foo类型实例化空对象(赋值)')
        self.name = name

    def __new__(cls, *args, **kwargs):
        print('Foo类型,创建Foo类型实例化空对象')
        new_obj = super(Foo, cls).__new__(cls)
        return new_obj

    def __call__(self, *args, **kwargs):
        print('Foo类型,执行Foo类型实例化对象')


obj = Foo('reds')  # <class '__main__.Foo'> 当前类型是由 metaclass(元类)创建。
print(obj)
obj()
# #############################################》当实例化类对象时《#######################################################
'''
    - 1.创建类型
        - 1.1 类型元类:__new__      --> 开辟空间,创建类型空对象 
        - 1.2 类型元类: __init__     --> 初始化类型对象(赋值)
        - 1.3 类型元类: __call__     --> 实例化类型对象(执行) Foo()
    - 2.创建类实例化对象
        - 2.1 类型对象: __new__     --> 开辟空间,创建类实例化空对象
        - 2.2 类型对象: __init__    --> 初始化类实例化对象(赋值)
        - 2.3 类型对象: __call__    --> 实例化类实例化对象(执行) obj()
    
'''

运行结果

E:\StudyClass\Python\MetaClass\Scripts\python.exe E:/StudyClass/Python/MetaClass/Include/metaclass_new_init_call_.py
MyType.__new__ MyType创建Foo类型空对象: <class '__main__.Foo'>
MyType.__init__ MyType初始化Foo类型空对象(赋值)
MyType.__call__ MyType执行Foo类型对象: <class '__main__.Foo'>
Foo类型,创建Foo类型实例化空对象
MyType元类调用Foo.__new__ 创建Foo类型的实例化空对象: <__main__.Foo object at 0x000002148E6BFCA0>
Foo类型,初始化Foo类型实例化空对象(赋值)
MyType元类调用Foo.__init__ 赋值Foo类型的实例化空对象: <__main__.Foo object at 0x000002148E6BFCA0>
<__main__.Foo object at 0x000002148E6BFCA0>
Foo类型,执行Foo类型实例化对象

posted @ 2022-11-05 18:04  Redskaber  阅读(398)  评论(0)    收藏  举报