gpt4 book ai didi

Python 基类的隐式 super() 调用

转载 作者:行者123 更新时间:2023-12-01 07:15:39 25 4
gpt4 key购买 nike

目前我正在开始复习Python的OOP知识。我偶然发现super()定义,这表明它为派生类提供了一组来自基类的实例变量和方法。

所以我有这段代码:

class foo:
bar = 5

def __init__(self, a):
self.x = a

def spam(self):
print(self.x)


class baz(foo):
pass

b = baz(5)
b.spam()

执行时没有 super()调用,没有错误,并打印出5 .

现在当我添加 __init__ 时派生类的方法,如下所示:

class foo:
bar = 5

def __init__(self, a):
self.x = a

def spam(self):
print(self.x)


class baz(foo):
def __init__(self, a):
self.b = a


b = baz(5)
b.spam()

脚本给我一个错误:AttributeError: 'baz' object has no attribute 'x' .

所以这表明,如果我的类有默认值 __init__ ,它还有一个明确的 super()称呼。我实际上找不到任何信息证实这一点,所以我只是想问问我是否正确。

最佳答案

问题是,当您在子类baz中定义方法__init__时,您不再使用父类foo中的方法>。然后,当您调用 b.spam() 时,x 不存在,因为它是在父类的 __init__ 方法中定义的。

如果您想要调用父类的 __init__ 方法并添加自己的逻辑,可以使用以下方法来解决此问题:

class baz(foo):
def __init__(self, a):
super().__init__(10) # you can pass any value you want to assign to x
self.b = a

>>> b = baz(5)
>>> b.spam()
10

关于Python 基类的隐式 super() 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57982134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com