从对象继承的子类与将类型定义为元类相同吗?

zvo*_*one 6 python new-style-class python-2.7 python-internals

这是一个旧式的课程:

class OldStyle:
    pass
Run Code Online (Sandbox Code Playgroud)

这是一个新式的课程:

class NewStyle(object):
    pass
Run Code Online (Sandbox Code Playgroud)

这也是一个新风格的类:

class NewStyle2:
    __metaclass__ = type
Run Code Online (Sandbox Code Playgroud)

有没有任何区别之间NewStyleNewStyle2

我的印象是继承的唯一影响object实际上是定义type元类,但我找不到任何确认,除此之外我没有看到任何区别.

Jim*_*ard 3

NewStyle几乎是的,和之间没有区别NewStyle2。两者都是类型typewhileOldStyle类型classobj

如果您从 object 继承子类,则将使用__class__of object(含义type) ;如果你提供一个__metaclass__将会被拾取的

如果没有提供任何内容__metaclass__并且您不继承自object,则将被指定为您的Py_ClassType元类。

在所有情况下,metaclass.__new__都会被呼叫。因为Py_ClassType.__new__它遵循定义的语义(我真的从来没有检查过它们),并且type.__new__它确保打包object在你的类的基础中。

当然,类似的效果可以通过以下方式实现:

cls = type("NewStyle3", (), {})
Run Code Online (Sandbox Code Playgroud)

立即致电type;这只是一个更大的麻烦:-)