-
__new__
:用来生成骨架
-
__init__
:骨架添加血肉
【一】类中的__new__
class MyClass(object):def __init__(self,name,age):print(f"给当前MyClass类的对象初始化属性的时候会触发__init__")self.name = nameself.age = age
def __call__(self,*args,**kwargs):print(f"当前 MyClass 类的对象被调用的时候会触发 __call__")return f'当前 MyClass 类 的 __call__ 的返回值 :>>>> {self.name}'
# 【三】画骨架,有骨架才能上色def __new__(cls, *args, **kwargs):print(f"给当前 MyClass 类的对象创建骨架的时候会触发 __new__")# 当前类本身print(f" MyClass 类 的 __call__ 的 cls :>>>> {cls}")# <class '__main__.MyClass'>
# 当前类初始化传的位置参数print(f" MyClass 类 的 __call__ 的 args :>>>> {args}")# ('knight',)
# 当前类初始化传的关键字参数print(f" MyClass 类 的 __call__ 的 args :>>>> {kwargs}")# {'age': 18}
# 【四】调用父类的object的new帮我搭骨架,将当前生成的骨架返回obj = object.__new__(cls)# 查看当前返回值发现是一个对象;类型print(f"obj:{obj}") # <__main__.MyClass object at 0x0000024E61B16830># 查看名称空间,发现是空的print(f"obj.__dict__:{obj.__dict__}") # {}# 【五】调用自己的__init__方法 初始化属性obj.__init__(*args, **kwargs)# 【六】给自己的名称空间初始化属性print(f"obj.__dict__:{obj.__dict__}") # {'name': 'knight', 'age': 18}# 返回生成的骨架return obj
# MyClass 相当于给你一张纸
# 【一】类() 调用 ---> 一定会触发 __init__ 初始化对象的属性 # __init__ 给你人体骨架上个色
# 【二】在调用 __init__ 之前要调用 __new__ # __new__ 相当于将你人体的骨架搭建好
m = MyClass('knight',age=18)
print(m.name) # knight
【二】元类中的__new__
class MyType(type):def __init__(cls,class_name,class_bases,class_name_space):super().__init__(class_name,class_bases,class_name_space)
def __call__(self, *args, **kwargs):# 得到一个空的对象obj = super().__call__(*args,**kwargs)return obj
# # 【三】画骨架,有骨架才能上色def __new__(cls, *args, **kwargs):print(f"给当前 MyType 类的对象创建骨架的时候会触发 __new__")# 给当前 MyType 类的对象创建骨架的时候会触发 __new__
# 当前类本身print(f" MyType 类 的 __call__ 的 cls :>>>> {cls}")# <class '__main__.MyType'>
# 当前类初始化传的位置参数print(f" MyType 类 的 __call__ 的 args :>>>> {args}")# ('knight',)
# 当前类初始化传的关键字参数print(f" MyType 类 的 __call__ 的 args :>>>> {kwargs}")# {'age': 18}
# 【四】寻求父类来帮助搭建骨架obj = type.__new__(cls, *args, **kwargs)print(f"obj:{obj}") # <class '__main__.MyClass'>print(f"obj.__dict__:{obj.__dict__}")# obj.__dict__:{'__module__': '__main__', '__init__': <function MyClass.__init__ at 0x000001A0B7C32170>, '__call__': <function MyClass.__call__ at 0x000001A0B7C32200>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, '__doc__': None}return obj
class MyClass(metaclass=MyType):def __init__(self,name,age):print(f"给当前MyClass类的对象初始化属性的时候会触发__init__")self.name = nameself.age = age
def __call__(self,*args,**kwargs):print(f"当前 MyClass 类的对象被调用的时候会触发 __call__")return f'当前 MyClass 类 的 __call__ 的返回值 :>>>> {self.name}'
m = MyClass('knight',age=18)
print(m.name) # knight