这是一个旧式的课程:
class OldStyle:
pass
这是一个新式的课程:
class NewStyle(object):
pass
这也是一种新式的课程:
class NewStyle2:
__metaclass__ = type
NewStyle
和NewStyle2
之间有什么区别吗?
我的印象是,继承object
的唯一效果实际上是定义type
元类,但我找不到任何确认,除此之外我没有看到任何差异。
答案 0 :(得分:3)
非常好,NewStyle
和NewStyle2
之间没有区别。两者都是type
类型,OldStyle
类型classobj
。
如果您从object继承,则使用__class__
of object
(meaning type
) is going;如果您提供__metaclass__
that is going to get picked up。
如果__metaclass__
没有提供任何内容,您就不会继承object
,Py_ClassType
is assigned as the metaclass。
在所有情况下,metaclass.__new__
都会被调用。对于Py_ClassType.__new__
,它遵循定义的语义(我从未检查过它们,真的)和类{* 3>}中的type.__new__
it makes sure to pack object
。
当然,通过以下方式实现了类似的效果:
cls = type("NewStyle3", (), {})
立即致电type
;这只是一个更大的麻烦: - )