Python Metaclass:理解’with_metaclass()’

Python Metaclass : Understanding the 'with_metaclass()'

我想问一下,在类的定义中,with_metaclass()调用意味着什么。

例如。:

1
class Foo(with_metaclass(Cls1, Cls2)):
  • 类从元类继承是一种特殊情况吗?
  • 新类也是元类吗?


with_metaclass()six库提供的一个实用类工厂函数,它使为python 2和3开发代码变得更容易。

它为您创建一个具有指定的元类的基类,与运行代码的Python版本兼容。

从文件中引用:

Create a new class with base class base and metaclass metaclass. This is designed to be used in class declarations like this:

1
2
3
4
5
6
7
8
9
10
from six import with_metaclass

class Meta(type):
    pass

class Base(object):
    pass

class MyClass(with_metaclass(Meta, Base)):
    pass

这是必需的,因为附加元类的语法在python 2和3之间发生了更改:

Python2:

1
2
class MyClass(object):
    __metaclass__ = Meta

Python3:

1
2
class MyClass(metaclass=Meta):
    pass

with_metaclass()函数利用了这样一个事实:元类是a)子类继承的,b)元类可以用来生成新的类;它通过使用元类作为工厂来生成空类,从而有效地创建了一个新的基类:

1
2
3
def with_metaclass(meta, *bases):
   """Create a base class with a metaclass."""
    return meta("NewBase", bases, {})

在python 2和3上,NewBase基类的元类都是meta


更新:six.with_metaclass()函数后来被一个修饰变量修补,即@six.add_metaclass()。此更新修复了一些与基本对象相关的MRO问题。新的装饰应用如下:

1
2
3
4
5
import six

@six.add_metaclass(Meta)
class MyClass(Base):
    pass

这里是补丁说明,这里是一个类似的、详细的示例和使用装饰器替代品的解释。