Python metaclass

2021/5/4 python

# 熟悉又陌生的 type

在日常使用中,我们经常使用 object 来派生一个类,事实上,在这种情况下,Python 解释器会调用 type 来创建类。

class Foo(object):
    pass

Foo = type('Foo', (object, ), {})

上面两种方式是等价的。我们看到,type 接收三个参数:

  • 字符串 'Foo',表示类名
  • 元组 (object, ),表示所有的父类
  • 字典,这里是一个空字典,表示没有定义属性和方法

类是实例对象的模板,元类是类的模板

元类的主要目的是为了控制类的创建行为

# 元类的使用

class Metaclass(type):
    def __new__(cls, name, bases, attrs):
        return type.__new__(cls, name, bases, _attrs)

    def __init__(self, name, bases, attrs):
        type.__init__(self, name, bases, attrs)

class Foo(metaclass=Metaclass):
    pass

在 Python 中,类也是一个对象, 类创建实例,元类创建类

元类主要做了三件事:

  • 拦截类的创建
  • 修改类的定义
  • 返回修改后的类