【问题标题】:In python, why do we always have to give 'object' as a parameter in a parent class?在python中,为什么我们总是必须在父类中将'object'作为参数?
【发布时间】:2014-08-05 22:04:02
【问题描述】:

为什么必须在所有新创建的父类中传递“对象”作为参数?

class Fish(object):
    pass
class Goldfish(Fish):
    pass

我们不能只处理将对象作为参数传递吗?

class Fish:
    pass
class Goldfish(Fish):
    pass

【问题讨论】:

  • 这不是python的特性
  • 附带说明,它不是参数,而是基类。 (嗯,从技术上讲,它调用元类的参数,但您通常不希望将类定义视为调用元类,您希望将其视为定义类...... ) 所以,你是说Fishobject 的子类。

标签: python class object parameters parent


【解决方案1】:

可以忽略它。在 Python 2 中,这将使这两个类成为你真正想要避免的所谓的 old-style classes(许多好东西不能很好地与它们一起工作),因此指南是包含它.在 Python 3 中,省略 (object) 完全等同于编写它,即没有区别。

【讨论】:

  • 如果您需要更多信息,请参阅NewStyleVsClassicClass。但在您准备好了解课程如何在幕后工作之前,最好只信任@delnan。
【解决方案2】:

如果您要询问 Python 让您从 object 继承的历史原因,而不仅仅是为什么要从 object 继承(delnan 已经回答):

Guido 在他的 Python 历史博客上的 New-style Classes 上有一篇很棒的帖子。它解释了 Python 2.1 中的类有什么问题(他链接到 a previous post,这解释了为什么类最初被设计为 hack*)。

那么,为什么不在 Python 2.2 中将所有内容都更改为新样式的类呢?因为那会破坏很多现有的代码。例如,Tkinter 多年未更新,** 它是标准库的一部分。

在 Python 3.0 中,如果好处值得破坏一些现有代码被认为是可以接受的,所以他们最终做出了改变:没有定义基类的类不是旧式类,它是新的——继承自 object 的样式类。


* 另见The inside story on new-style classesMethod resolution order——见鬼,请阅读整个博客; Guido 是一位优秀的作家,你会学到很多东西。 :)

** Tkinter 的 2.7 版本仍然使用旧式类,但是如果您编辑代码以将所有内容更改为从 object 继承,它就可以工作。我相信直到 2.5 或 2.6 才出现这种情况。

【讨论】:

    【解决方案3】:

    在 Python 3 中,是的,您可以忽略它。在 Python 2 中,您不想忽略它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      相关资源
      最近更新 更多