10

ここに属性 '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()
4

2 に答える 2

15

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

編集: abarnert が以下で言及しているように、 と の間には大きな違いがClass.aありc.aます。インスタンス属性 (2 番目のケース) は特定の各オブジェクトに属しますが、クラス属性はクラスに属します。詳細については、以下の abarnert のコメントまたはここでのディスカッションを参照してください。

あなたのコードはと同等です

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
于 2013-04-23T00:01:53.637 に答える
3

例のように、を呼び出さずに行うと、新しく作成されたインスタンスにClassは属性がありません。ainstance_of_class.method_2()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

于 2013-04-23T00:01:14.443 に答える