ここに私は最初のクラスのメソッドで定義され、2番目に変更する必要がある属性 'a'があります。それらを順番に呼び出すと、次のメッセージが表示されます。
AttributeError: 'Class'オブジェクトには属性 'a'がありません
私が見つけた唯一の方法-2番目の方法で「a」をもう一度定義しますが、実際のコードでは継承が長く、アプリがめちゃくちゃになります。なぜ動作しないのですか? self.aはClass.aと等しくないですか?
class Class(object):
def method_1(self):
self.a = 1
def method_2(self):
self.a += 1
Class().method_1()
Class().method_2()
短い答え、いいえ。コードの問題は、新しいインスタンスを作成するたびに発生します。
編集:abarnertが以下で言及するように、Class.a
とc.a
の間には大きな違いがあります。インスタンス属性(2番目のケース)は特定の各オブジェクトに属し、クラス属性はクラスに属します。詳細については、以下のabarnertのコメントまたはディスカッション here を参照してください。
あなたのコードは
c1 = Class()
c1.method_1() # defines c1.a (an instance attribute)
c2 = Class()
c2.method_2() # c2.a undefined (the c2 instance doesn't have the attribute)
あなたはおそらく次のようなことをしたいでしょう
c = Class()
c.method_1() # c.a = 1
c.method_2() # c.a = 2
print "c.a is %d" % c.a # prints "c.a is 2"
あるいは、c
をa
属性で初期化することをお勧めします
class Class:
def __init__(self):
self.a = 1 # all instances will have their own a attribute
呼び出しなしでinstance_of_class.method_2()
を実行すると、Class
の新しく作成されたインスタンスに属性a
がありません。 method_1
、例のように。
このわずかに変更されたバージョンのコードを考えてみます。
class CreateNewClassInstance(object):
def create_a(self):
self.a = 1
def add_one_to_a(self):
self.a += 1
CreateNewClassInstance().create_a()
CreateNewClassInstance().add_one_to_a()
Class()
(またはCreateNewClassInstance()
)を呼び出すたびに、独自の属性a
。 a
を初期化するまで、その名前の属性はありません。
ほとんどの場合、これは問題ではありません。ただし、+=
は、追加する前にself.a
をロードしようとします。これが、この場合AttributeError
の原因です。