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

时间:2016-09-15 01:03:52

标签: python python-2.7 python-internals new-style-class

这是一个旧式的课程:

class OldStyle:
    pass

这是一个新式的课程:

class NewStyle(object):
    pass

这也是一种新式的课程:

class NewStyle2:
    __metaclass__ = type

NewStyleNewStyle2之间有什么区别吗?

我的印象是,继承object的唯一效果实际上是定义type元类,但我找不到任何确认,除此之外我没有看到任何差异。

1 个答案:

答案 0 :(得分:3)

非常好,NewStyleNewStyle2之间没有区别。两者都是type类型,OldStyle类型classobj

如果您从object继承,则使用__class__ of object (meaning type) is going;如果您提供__metaclass__ that is going to get picked up

如果__metaclass__没有提供任何内容,您就不会继承objectPy_ClassType is assigned as the metaclass

在所有情况下,metaclass.__new__都会被调用。对于Py_ClassType.__new__,它遵循定义的语义(我从未检查过它们,真的)和类{* 3>}中的type.__new__ it makes sure to pack object

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

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

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