6

这是一个老式的类:

class OldStyle:
    pass

这是一个新型类:

class NewStyle(object):
    pass

这也是一个新式类:

class NewStyle2:
    __metaclass__ = type

NewStyle和之间有什么区别NewStyle2吗?

我的印象是继承自的唯一效果object实际上是定义type元类,但我找不到任何确认,除了我没有看到任何区别。

4

1 回答 1

3

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

如果您从对象子类化,则将使用__class__of object(含义type;如果你提供一个__metaclass__会被捡起来的东西

如果没有提供 as__metaclass__并且您不继承自object,Py_ClassType则分配为您的元类。

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

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

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

立即拨打电话的地方type;这只是一个更大的麻烦:-)

于 2016-10-11T22:10:15.220 回答