长时间读者,第一次问问。无论如何,这是我正在使用的代码:
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's shout方法替换其(孩子的)“self”替换父级(方法所在的位置)。显然,事实并非如此。我知道我可以在init之外声明名称,但是这两者都无法容纳输入的数据和禁止输入数据。另一种选择是为Person的每个孩子重新定义呼喊,但这是我试图避免的许多重复代码。
非常感谢!
答案 0 :(得分:5)
问题是@classmethod
是一个类的方法。它无权访问实例的属性。具体来说,该方法实际上是传递了类对象,因此self
被错误命名。你应该真正调用shout
的参数cls
。如果您删除@classmethod
,那么这一切都有意义,您的代码将按预期工作。
实际上,您可以将k.shout()
视为等同于Kid.shout()
。