本文主要是介绍元类结合__new__,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
-
__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
这篇关于元类结合__new__的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!