从对象子类化是否与将类型定义为元类相同?

Is subclassing from object the same as defining type as metaclass?

这是旧式class:

class OldStyle:
    pass

这是新款class:

class NewStyle(object):
    pass

这也是新款class:

class NewStyle2:
    __metaclass__ = type

NewStyleNewStyle2有什么区别吗?

我的印象是从 object 继承的唯一效果实际上是定义 type 元 class,但除此之外我找不到任何证实我看不出有什么不同。

几乎是的,NewStyleNewStyle2 之间没有区别。两者都是 type 类型,而 OldStyleclassobj.

类型

如果您从对象子class,__class__ of object (meaning type) is going to be used; if you supply a __metaclass__ that is going to get picked up

如果 __metaclass__ 没有提供任何内容并且您没有从 object 继承,Py_ClassType is assigned as the metaclass 为您提供。

在所有情况下,metaclass.__new__ 都会被调用。对于 Py_ClassType.__new__ 它遵循定义的语义(我从来没有检查过它们,真的)并且对于 type.__new__ it makes sure to pack object 在你的 class.

的基础上

当然,类似的效果是通过:

cls = type("NewStyle3", (), {})

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