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类型实例化对象