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
通过以这种方式创建自定义元类,可以更改类的构造方式。这允许您在创建类时添加或删除属性和方法,注册类的创建和子类的创建,以及各种其他操作。