2

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

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 的喊叫方法,将其(孩子的)“自我”替换为 parent(该方法所在的位置)。显然,事实并非如此。我知道我可以在 init 之外声明名称,但这既不能容纳输入的数据又不能。另一种选择是为 Person 的每个孩子重新定义喊叫,但这是我试图避免的大量重复代码。

首先十分感谢!

4

1 回答 1

6

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

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

于 2012-11-15T01:25:55.100 回答