gpt4 book ai didi

python - 如何让子类在不重新定义父变量的情况下使用它们?

转载 作者:行者123 更新时间:2023-11-28 21:26:13 24 4
gpt4 key购买 nike

长期阅读,第一次提问。无论如何,这是我正在使用的代码:

class Person(object):
def __init__(self, s):
self.name = s
self.secret = 'I HAVE THE COOKIES'

@classmethod
def shout(self):
print self.name.upper()

class Kid(Person):
def __init__(self, s):
super(Kid,self).__init__(s)
self.age = 12

b = Person('Bob')
k = Kid('Bobby')
print b.name
print k.name
print k.age
print k.secret
k.shout()

导致此输出和错误:

Bob
Bobby
12
I HAVE THE COOKIES
Traceback (most recent call last):
File "a.py", line 22, in <module>
k.shout()
File "a.py", line 8, in shout
print self.name.upper()
AttributeError: type object 'Kid' has no attribute 'name'

我假设 Kid 能够使用 Person 的 shout 方法,用它的( child 的)“self”代替 parent(方法所在的地方)。显然,事实并非如此。我知道我可以在 init 之外声明名称,但这既无法容纳输入的数据,也是一个禁忌。另一种选择是为 Person 的每个 child 重新定义 shout,但这是我试图避免的大量重复代码。

非常感谢!

最佳答案

问题是 @classmethod 是一个类的方法。它无权访问实例的属性。具体来说,该方法实际上传递了类对象,因此 self 被错误命名。你真的应该调用 shout 的参数 cls。如果您删除 @classmethod 那么这一切都有意义并且您的代码将按预期工作。

实际上,您可以将 k.shout() 视为等同于 Kid.shout()

关于python - 如何让子类在不重新定义父变量的情况下使用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13390201/

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