从Python 3.x中的python对象继承是必要还是有用的?


93

在较旧的python版本中,当您在python中创建类时,它可以从object继承,据我所知,它内置了一个特殊的内置python元素,该元素允许您的对象成为新型对象。

较新的版本(> 3.0和2.6)呢?我搜索了有关类对象的信息,但得到了很多结果(由于明显的原因)。有什么提示吗?

谢谢!


2
如果您的代码也将在2.x下使用,则最好明确。
smci 2011年

1
这个问题的答案很好:stackoverflow.com/questions/4015417/…–
nngeek

Answers:


92

您无需继承object即可在python 3中具有新样式。所有类都是新样式。


5
请注意,这意味着所有类都继承自Python 3.1 ,object无论是否键入显式内容(object)
u0b34a0f6ae

8
您不必这样做,但是“将Python代码移植到Python 3”中说它仍然有效:docs.python.org/py3k/howto/pyporting.html#subclass-object另外:docs.python.org/reference/ …
hyperboreean 2012年

这篇文章中nngeek的评论中提到,似乎是旧式与新式(只真正的Py2相关的)一个好的稳定的参考是:docs.python.org/2/reference/... -上面的链接似乎有自从改变了。
艾里克·库西诺

80

我意识到这是一个古老的问题,但是值得注意的是,即使在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

因此,您可以看到,在从对象显式继承对象的情况下,我们得到的行为与允许隐式继承的行为不同。


13
这很重要,因为通常期望行为是等效的。这是不相等的,因此是我的观察。
菲利普·阿德勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.