Python 编程/元类
外观
(从 Python 编程/元类 重定向)
在 Python 中,类本身也是对象。就像其他对象是特定类的实例一样,类本身也是元类的实例。
Pep 3115 定义了 python 3 元类的更改。在 python3 中,您有一个 __prepare__ 方法,它在元类中被调用来创建一个字典或其他类来存储类成员。[1] 然后是 __new__ 方法,它被调用来创建该类的新的实例。[2]
所有标准 Python 类型的元类是 "type" 对象。
>>> type(object)
<type 'type'>
>>> type(int)
<type 'type'>
>>> type(list)
<type 'type'>
就像 list、int 和 object 一样,"type" 本身也是一个普通的 Python 对象,并且本身也是一个类的实例。在这种情况下,它实际上是它自己的实例。
>>> type(type)
<type 'type'>
它可以被实例化为创建新的类对象,类似于上面的类工厂示例,通过传递新类的名称、要继承的基类以及定义要使用的命名空间的字典。
例如,代码
>>> class MyClass(BaseClass):
... attribute = 42
也可以写成
>>> MyClass = type("MyClass", (BaseClass,), {'attribute' : 42})
可以通过在定义类时设置 metaclass 关键字参数,创建一个与 type 不同的元类的类。当这样做时,类及其子类将使用您自定义的元类创建。例如
class CustomMetaclass(type):
def __init__(cls, name, bases, dct):
print("Creating class %s using CustomMetaclass" % name)
super(CustomMetaclass, cls).__init__(name, bases, dct)
class BaseClass(metaclass=CustomMetaclass):
pass
class Subclass1(BaseClass):
pass
这将打印
Creating class BaseClass using CustomMetaclass Creating class Subclass1 using CustomMetaclass
通过以这种方式创建自定义元类,可以改变类的构建方式。这允许您在创建类时添加或删除属性和方法,注册类的创建和子类的创建以及各种其他操作。