【问题标题】:Why does inheriting from object make a difference in Python? [duplicate]为什么从对象继承在 Python 中会有所不同? [复制]
【发布时间】:2013-08-23 03:22:06
【问题描述】:

当类从无继承时,我有一个实例类型的对象。

>>> class A(): pass;
>>> a = A()
>>> type(a)
<type 'instance'>
>>> type(a) is A
False
>>> type(A)
<type 'classobj'>

但是,当我从一个对象继承同一个类时,创建的对象是 A 类型。

>>> class A(object): pass;
>>> a = A()
>>> type(a)
<class '__main__.A'>
>>> type(a) is A
True
>>> type(A)
<type 'type'>

这背后的逻辑是什么?这是否意味着每个类都应该继承自对象

【问题讨论】:

标签: python object inheritance


【解决方案1】:

在 Python 3 中,这两者是相同的。然而,在 Python 2 中:

class A: pass  # old-style class

class B(object): pass  # new-style class

来自文档中的New-style and classic classes

直到 Python 2.1,旧式类是用户唯一可用的风格。 (旧式)类的概念与类型的概念无关:如果x是旧式类的实例,则x.__class__指定x的类,但type(x)总是&lt;type 'instance'&gt;。这反映了这样一个事实,即所有老式实例,独立于它们的类,都是用一个称为实例的内置类型实现的。

Python 2.2 中引入了新样式的类来统一类和类型。新式类既不多也不少于用户定义的类型。 如果x 是新式类的实例,则type(x)x.__class__ 相同。

引入新型类的主要动机是提供一个具有完整元模型的统一对象模型。它还具有许多直接的好处,例如能够对大多数内置类型进行子类化,或者引入启用计算属性的“描述符”。

由于这些原因,尽可能使用新式类是个好主意。 Python 2.2+ 中甚至存在老式类的唯一原因是为了向后兼容。在 Python 3 中,旧式类已被移除。

【讨论】:

  • 不错的答案。我将建议添加类似“使用旧式类的唯一原因是当您调用某个需要您提供instances 的古老库时”,但您的最后一次编辑很好地涵盖了这一点。
【解决方案2】:

Python 中用户定义类的原始实现很糟糕。 2.2 修复了它,但为了向后兼容,他们不得不保留旧系统。因此,Python 有 2 种类型的类,“经典”和“新风格”。任何从object(直接或间接)继承的东西都是新式的;没有的就是经典。您编写的每个类都应该以某种方式从 object 继承,如果它没有任何其他父级则直接继承,或者因为它从另一个新样式类(或内置类型)继承而间接继承。

http://python-history.blogspot.com/2010/06/new-style-classes.html

【讨论】:

    【解决方案3】:

    这解释了instance 的事情:

    >>> class A(): pass;
    >>> A
    <class __main__.A at 0x7f879998b050>
    >>> A()                                            
    <__main__.A instance at 0x7f87999a83b0>
    

    但无论如何你不应该使用type() 来比较python 中的对象,你应该使用isinstance()

    【讨论】:

      猜你喜欢
      • 2011-04-30
      • 2013-10-04
      • 2012-05-17
      • 2010-09-17
      • 2016-07-27
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      相关资源
      最近更新 更多