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 のshout メソッドを使用できると想定しました。どうやら、そうではありません。init の外で name を宣言できることは知っていますが、それは入力されたデータに対応できず、ダメです。もう 1 つの方法は、Person のすべての子に対してshout を再定義することですが、それは私が避けようとしているコードの繰り返しです。

よろしくお願いします!

4

1 に答える 1

6

問題は、それ@classmethodがクラスのメソッドであることです。インスタンスの属性にはアクセスできません。具体的には、メソッドには実際にクラス オブジェクトが渡されるため、self名前が間違っています。shoutの引数を実際に呼び出す必要がありますcls。を削除すると@classmethod、これはすべて意味があり、コードは期待どおりに機能します。

k.shout()このままではと同等と考えることができますKid.shout()

于 2012-11-15T01:25:55.100 に答える