web-dev-qa-db-ja.com

1つのメソッドで作成された属性が他のメソッドに存在しない

ここに私は最初のクラスのメソッドで定義され、2番目に変更する必要がある属性 'a'があります。それらを順番に呼び出すと、次のメッセージが表示されます。

AttributeError: 'Class'オブジェクトには属性 'a'がありません

私が見つけた唯一の方法-2番目の方法で「a」をもう一度定義しますが、実際のコードでは継承が長く、アプリがめちゃくちゃになります。なぜ動作しないのですか? self.aClass.aと等しくないですか?

class Class(object):
    def method_1(self):
        self.a = 1
    def method_2(self):
        self.a += 1

Class().method_1()
Class().method_2()
10
user2309239

短い答え、いいえ。コードの問題は、新しいインスタンスを作成するたびに発生します。

編集:abarnertが以下で言及するように、Class.ac.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"

あるいは、ca属性で初期化することをお勧めします

class Class:
    def __init__(self):
        self.a = 1  # all instances will have their own a attribute
15
Felipe

呼び出しなしで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())を呼び出すたびに、独自の属性aaを初期化するまで、その名前の属性はありません。

ほとんどの場合、これは問題ではありません。ただし、+=は、追加する前にself.aをロードしようとします。これが、この場合AttributeErrorの原因です。

3
Sean Vieira