关于python:从对象的子类化与将类型定义为元类相同吗?

Is subclassing from object the same as defining type as metaclass?

这是一个老式的类:

1
2
class OldStyle:
    pass

这是一个新的类型:

1
2
class NewStyle(object):
    pass

这也是一个新的类型:

1
2
class NewStyle2:
    __metaclass__ = type

NewStyleNewStyle2有什么区别吗?

我认为继承object的唯一效果实际上是定义type元类,但是除了没有发现任何区别之外,我没有找到任何证实。


差不多是的,NewStyleNewStyle2之间没有区别。二者均为type型,OldStyleclassobj型。

如果从object子类,将使用object__class__(意思是type);如果提供__metaclass__,将被拾取。

如果没有任何东西作为__metaclass__提供,而您没有继承object,那么Py_ClassType将被指定为您的元类。

在所有情况下,metaclass.__new__都会接到电话。对于Py_ClassType.__new__,它遵循定义的语义(我从未真正检查过它们),对于type.__new__,它确保将object打包到类的基部。

当然,类似的效果是通过:

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

直接打电话给type的地方,麻烦就更大了。