Python 继承与 __init__

3

我是一名学习Python的人,发现了一些关于Python构造子类的内容,让我感到有些困惑。

我有一个继承自列表类的类,代码如下。

class foo(list):
    def __init__(self, a_bar):
        list.__init__([])
        self.bar = a_bar

我知道需要使用list.__init__([]),但是我对此感到困惑。在我看来,这一行只会创建一个新的列表对象,并将其分配给一个空值,因此我认为它只会被垃圾回收。Python如何知道这个列表是我的对象的一部分?我怀疑在幕后发生了一些事情,想知道具体是什么。


3
你从哪里找到这段代码的?它是错误的。 - David Robinson
4个回答

3
多重继承可靠的方法是:

执行它的方法是:
class foo(list):
    def __init__(self, a_bar):
        super(foo, self).__init__()
        ...

也许这样更清晰,你正在调用基类构造函数。

需要更多的措施才能确保MI安全。 - user395760
3
жҜ”еҰӮпјҢ继жүҝж ‘дёӯзҡ„жүҖжңүзұ»йғҪеҗҢж„ҸдҪҝз”ЁsuperжқҘзәҰе®ҡ__init__еҸӮж•°гҖӮиҜ·еҸӮйҳ… Python's super() considered super!гҖӮ - user395760

2

当你创建子类并重写 __init__() 函数时,通常会这样做:

list.__init__(self)

如果您使用的是Python 3,您可以使用super()
super().__init__()

1

你说的部分对:

list.__init__([]) 

创建一个新的列表对象。但是这段代码是错误的。正确的代码应该是:

list.__init__(self)

你需要让它存在的原因是因为你从一个具有自己__init__()方法的list继承,其中它(可能)对初始化自身很重要。当你定义自己的__init__()方法时,你实际上是覆盖了同名的继承方法。为了确保父类的__init__()代码也被执行,你需要调用那个父类的__init__()
有几种方法可以做到这一点:
#explicitly calling the __init__() of a specific class
#"list"--in this case
list.__init__(self, *args, **kwargs)     

#a little more flexible. If you change the parent class, this doesn't need to change
super(foo, self).__init__(*args, **kwargs) 

关于 super() 的更多信息,请参见this question,有关 super 的陷阱指南,请参见this article


1
实际对象不是用__init__创建的,而是用__new__创建的。 __init__不是用于创建对象本身,而是用于初始化它——即添加属性等。在调用__init__时,__new__已经被调用,因此在您的示例中,在代码运行之前列表已经被创建。__init__不应该返回任何东西,因为它应该“原地”初始化对象(通过突变),所以它通过副作用工作。(请参见以前的问题文档。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接