1.metaclass -- 元类
一种用于创建类的类。类定义包含类名、类字典和基类列表。元类负责接受上述三个参数并创建相应的类。大部分面向对象的编程语言都会提供一个默认实现。Python 的特别之处在于可以创建自定义元类。大部分用户永远不需要这个工具,但当需要出现时,元类可提供强大而优雅的解决方案。它们已被用于记录属性访问日志、添加线程安全性、跟踪对象创建、实现单例,以及其他许多任务。
默认情况下,类是使用 type()
来构建的。类体会在一个新的命名空间内执行,类名会被局部绑定到 type(name,bases, namespace)
的结果。
类创建过程可通过在定义行传入 metaclass
关键字参数,或是通过继承一个包含此参数的现有类来进行定制。在以下示例中,MyClass
和 MySubclass
都是 Meta
的实例:
class Meta(type): pass class MyClass(metaclass=Meta): pass class MySubclass(MyClass): pass
上面是官方解释,有些不好懂,看看究竟什么是元类
class Test(metaclass=type): pass test = Test() print(type(test)) #test的类是Test print(type(Test)) #Test的类是type,说明Test是由type这个类实例化出来的
可以看出:元类就是用来实例化类的,是类的类,比如上面的Test类就是由系统自带的type实例化出来的。
2.如何用元类来实例化类,上面的是一种方式
class Test(metaclass=type)
第二种方式
def __init__(self, name): self.name = name # type(object_or_name, bases, dict) Test111 = type(‘Test‘, (object,), {‘x‘: 1, ‘init‘: __init__}) print(Test111) print(Test111.__dict__)
3.自定义元类
一般使用第一种方式,自定义元类,可以通过继承type,或是metaclass的方式自定义元类
class Mytype(object,metaclass=type): def __init__(self, *args, **kwargs): print(‘======>from Mytype __init__‘) def __new__(cls, *args, **kwargs): print(‘======>from Mytype __new__‘) print(args) #Mytype(object_or_name, bases, dict) print(kwargs) obj=super().__new__(cls) #调用父类的new print(obj) # return obj class Test(metaclass=Mytype): #Test=Mytype(Test)实例化 ,Mytype(object_or_name, bases, dict) #Mytype 调了Mytype.__new__ def __init__(self): print(‘======>from Test__init‘)
执行顺序。
可以看出一旦执行元类,也就是实例化Test,会去执行元类Mytype的__new__,生成对象以后,再执行__init__。为什么会这么执行呢?因为执行了Mytype的元类中的__call__方法。请看下期
python基础-面向对象(二十六)面向对象进阶(十四)元类(一),__new__,__init__
原文:https://www.cnblogs.com/liaoyifu/p/14156134.html