从对象子类化是否与将类型定义为元类相同?
Is subclassing from object the same as defining type as metaclass?
这是旧式class:
class OldStyle:
pass
这是新款class:
class NewStyle(object):
pass
这也是新款class:
class NewStyle2:
__metaclass__ = type
NewStyle
和NewStyle2
有什么区别吗?
我的印象是从 object
继承的唯一效果实际上是定义 type
元 class,但除此之外我找不到任何证实我看不出有什么不同。
几乎是的,NewStyle
和 NewStyle2
之间没有区别。两者都是 type
类型,而 OldStyle
是 classobj
.
类型
如果您从对象子class,__class__
of object
(meaning type
) is going to be used; if you supply a __metaclass__
that is going to get picked up。
如果 __metaclass__
没有提供任何内容并且您没有从 object
继承,Py_ClassType
is assigned as the metaclass 为您提供。
在所有情况下,metaclass.__new__
都会被调用。对于 Py_ClassType.__new__
它遵循定义的语义(我从来没有检查过它们,真的)并且对于 type.__new__
it makes sure to pack object
在你的 class.
的基础上
当然,类似的效果是通过:
cls = type("NewStyle3", (), {})
立即调用type
;这只是一个更大的麻烦:-)
这是旧式class:
class OldStyle:
pass
这是新款class:
class NewStyle(object):
pass
这也是新款class:
class NewStyle2:
__metaclass__ = type
NewStyle
和NewStyle2
有什么区别吗?
我的印象是从 object
继承的唯一效果实际上是定义 type
元 class,但除此之外我找不到任何证实我看不出有什么不同。
几乎是的,NewStyle
和 NewStyle2
之间没有区别。两者都是 type
类型,而 OldStyle
是 classobj
.
如果您从对象子class,__class__
of object
(meaning type
) is going to be used; if you supply a __metaclass__
that is going to get picked up。
如果 __metaclass__
没有提供任何内容并且您没有从 object
继承,Py_ClassType
is assigned as the metaclass 为您提供。
在所有情况下,metaclass.__new__
都会被调用。对于 Py_ClassType.__new__
它遵循定义的语义(我从来没有检查过它们,真的)并且对于 type.__new__
it makes sure to pack object
在你的 class.
当然,类似的效果是通过:
cls = type("NewStyle3", (), {})
立即调用type
;这只是一个更大的麻烦:-)