这是一个老式的类:
class OldStyle:
pass
这是一个新型类:
class NewStyle(object):
pass
这也是一个新式类:
class NewStyle2:
__metaclass__ = type
NewStyle和之间有什么区别NewStyle2吗?
我的印象是继承自的唯一效果object实际上是定义type元类,但我找不到任何确认,除了我没有看到任何区别。
这是一个老式的类:
class OldStyle:
pass
这是一个新型类:
class NewStyle(object):
pass
这也是一个新式类:
class NewStyle2:
__metaclass__ = type
NewStyle和之间有什么区别NewStyle2吗?
我的印象是继承自的唯一效果object实际上是定义type元类,但我找不到任何确认,除了我没有看到任何区别。
几乎是的,NewStyle和之间没有区别NewStyle2。两者都是 typetype而OldStyletype classobj。
如果您从对象子类化,则将使用__class__of object(含义type);如果你提供一个__metaclass__会被捡起来的东西。
如果没有提供 as__metaclass__并且您不继承自object,Py_ClassType则分配为您的元类。
在所有情况下,metaclass.__new__都会被调用。因为Py_ClassType.__new__它遵循定义的语义(我从来没有检查过它们,真的),并且type.__new__它确保打包object到你的类的基础中。
当然,类似的效果是通过以下方式实现的:
cls = type("NewStyle3", (), {})
立即拨打电话的地方type;这只是一个更大的麻烦:-)