Is subclassing from object the same as defining type as metaclass?
这是一个老式的类:
这是一个新的类型:
1 2
| class NewStyle(object):
pass |
号
这也是一个新的类型:
1 2
| class NewStyle2:
__metaclass__ = type |
NewStyle和NewStyle2有什么区别吗?
我认为继承object的唯一效果实际上是定义type元类,但是除了没有发现任何区别之外,我没有找到任何证实。
差不多是的,NewStyle和NewStyle2之间没有区别。二者均为type型,OldStyle为classobj型。
如果从object子类,将使用object的__class__(意思是type);如果提供__metaclass__,将被拾取。
如果没有任何东西作为__metaclass__提供,而您没有继承object,那么Py_ClassType将被指定为您的元类。
在所有情况下,metaclass.__new__都会接到电话。对于Py_ClassType.__new__,它遵循定义的语义(我从未真正检查过它们),对于type.__new__,它确保将object打包到类的基部。
当然,类似的效果是通过:
1
| cls = type("NewStyle3", (), {}) |
直接打电话给type的地方,麻烦就更大了。