【问题标题】:Is it necessary or useful to inherit from Python's object in Python 3.x?在 Python 3.x 中从 Python 的对象继承是否有必要或有用?
【发布时间】:2010-11-17 08:08:18
【问题描述】:

在较旧的 Python 版本中,当您创建类时,它可以从 object 继承,据我所知,这是一个特殊的内置 Python 元素,可以让您的类成为新样式的类。

较新的版本(> 3.0 和 2.6)呢?我在 Google 上搜索了 object 课程,但我得到了很多结果(原因很明显)。

【问题讨论】:

标签: python python-3.x


【解决方案1】:

你不需要继承 object 在 python 3 中拥有新风格。所有类都是新风格。

【讨论】:

【解决方案2】:

我意识到这是一个老问题,但值得注意的是,即使在 python 3 中,这两个东西也不完全相同。

如果您明确地从object 继承,那么您实际上所做的就是从builtins.object 继承无论当时指向什么。

因此,我可以有一些(非常古怪的)模块,它出于某种原因覆盖对象。我们将这第一个模块称为“newobj.py”:

import builtins

old_object = builtins.object  # otherwise cyclic dependencies

class new_object(old_object):

    def __init__(self, *args, **kwargs):
        super(new_object, self).__init__(*args, **kwargs)
        self.greeting = "Hello World!" 

builtins.object = new_object  #overrides the default object

然后在其他文件中(“klasses.py”):

class Greeter(object):
    pass

class NonGreeter:
    pass

然后在第三个文件中(我们可以实际运行):

import newobj, klasses  # This order matters!

greeter = klasses.Greeter()
print(greeter.greeting)  # prints the greeting in the new __init__

non_greeter = klasses.NonGreeter()
print(non_greeter.greeting) # throws an attribute error

所以你可以看到,在它显式继承自对象的情况下,我们得到的行为与你允许隐式继承的情况不同。

【讨论】:

  • 这是相关的,因为通常期望行为是等效的。这是不等价的,因此我的观察。
  • 当有人删除他们的 cmets 让您看起来像是在自言自语时,您不只是讨厌它吗?
猜你喜欢
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 2012-07-23
  • 2015-01-20
  • 2019-12-01
  • 2023-03-25
  • 1970-01-01
  • 2023-01-13
相关资源
最近更新 更多