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

tho*_*mas 74 python python-3.x

在旧的python版本中,当你在python中创建一个类时,它可以从对象继承,这是我理解的一个特殊的内置python元素,它允许你的对象成为一个新式的对象.

那么新版本(> 3.0和2.6)呢?我用google搜索了类对象,但是得到了很多结果(显而易见的原因).任何提示?

谢谢!

Sil*_*ost 70

你不需要继承objectpython 3中的新样式.所有类都是新式的.

  • 你没必要,但是"将Python代码移植到Python 3"说它仍然有效:http://docs.python.org/py3k/howto/pyporting.html#subclass-object另外:http:// docs.python.org/reference/datamodel.html#new-style-and-classic-classes (6认同)
  • 请注意,这意味着所有类都继承自`object`,无论是否在Python 3.1中键入显式的`(object)` (4认同)

Phi*_*ler 64

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

然后在其他一些文件("klasses.py")中:

class Greeter(object):
    pass

class NonGreeter:
    pass
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

因此,您可以看到,在显式继承自object的情况下,我们获得的行为与允许隐式继承的行为不同.

  • 这是相关的,因为通常期望行为是等效的。这是不等价的,因此是我的观察结果。 (15认同)
  • 当有人删除他们的评论,让你看起来像是在自言自语时,你难道不讨厌吗? (13认同)