这是一个老式的类:
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
而OldStyle
type classobj
。
如果您从对象子类化,则将使用__class__
of object
(含义type
);如果你提供一个__metaclass__
会被捡起来的东西。
如果没有提供 as__metaclass__
并且您不继承自object
,Py_ClassType
则分配为您的元类。
在所有情况下,metaclass.__new__
都会被调用。因为Py_ClassType.__new__
它遵循定义的语义(我从来没有检查过它们,真的),并且type.__new__
它确保打包object
到你的类的基础中。
当然,类似的效果是通过以下方式实现的:
cls = type("NewStyle3", (), {})
立即拨打电话的地方type
;这只是一个更大的麻烦:-)