【问题标题】:Is subclassing from object the same as defining type as metaclass?对象的子类化与将类型定义为元类相同吗?
【发布时间】:2017-01-22 22:17:35
【问题描述】:

这是一个老式的类:

class OldStyle:
    pass

这是一个新式类:

class NewStyle(object):
    pass

这也是一个新式类:

class NewStyle2:
    __metaclass__ = type

NewStyleNewStyle2 之间有什么区别吗?

我的印象是从object 继承的唯一效果实际上是定义type 元类,但我找不到任何确认,除了我没有看到任何区别。

【问题讨论】:

    标签: python python-2.7 python-internals new-style-class


    【解决方案1】:

    几乎是的,NewStyleNewStyle2 之间没有区别。两者都属于type 类型,而OldStyle 属于classobj 类型。

    如果你从对象继承,__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__,它遵循定义的语义(我从来没有检查过它们,真的),对于type.__new__ it makes sure to pack object,它在你的类的基础中。

    当然,类似的效果是这样实现的:

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

    立即致电type;这只是一个更大的麻烦:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 2014-07-23
      相关资源
      最近更新 更多