2017-10-05 4 views
1

オブジェクトのアトリビュートにアクセスする際に問題が発生しています。割り当て自体はオブジェクトの属性の数を比較する多数のアルゴリズムを作成していますが、属性にアクセスすることができなかったことを考慮すると、それを得ることさえできません。オブジェクトのオブジェクトのアトリビュートにアクセスすると、pythonで属性エラーが発生します

私は下記のコードと同様のコードスニペットを書いています。私が問題を抱えているのは、list_of_things.items[0].attribute1にアクセスしようとするときです。私は変更することはできませんよ

class Thing: 
    def __init__(self, attribute1='y', attribute2='n'): 
     self.attribute1, self.attribute2 = attribute1, attribute2 
    def give_a_thing(self): 
     return self 

class ThingOfThings: 
    def __init__(self, items=[]): 
     self.items = items 
    def get_thing(self, thing): 
     self.items += [thing] 

list_of_things = ThingOfThings() 

one_thing = Thing() 
for i in range(2): 
    list_of_things.get_thing(one_thing.give_a_thing) 
print(list_of_things.items[0].attribute1) 

:私は正しく項目にアクセスしてることを確認するために、単純に印刷しようとしていますが、私は次のエラーを取得しています:

Traceback (most recent call last): 
    File "./test.py", line 22, in <module> 
    print(list_of_things.items[0].attribute1) 
AttributeError: 'function' object has no attribute 'attribute1' 

同様のコードは以下の通りですいずれかのクラスが、私の割り当てにdefを追加します。

質問:

  1. 私はlist_of_thingsからいずれかの属性にアクセスするにはどうすればよいですか?
  2. 属性にアクセスするにはどうすればよいですか? items[0].attribute1が上attributeにアクセスしようとしているので、

    AttributeError: 'function' object has no attribute 'attribute1' 
    

    そして、それは次のようになります。(仕事が印刷されますか、アドレスを与える)

+1

が、 '[]' 'items'が_The同じinstance_でのデフォルト引数にコンストラクタが呼び出されるたびに呼び出されます。 –

+0

問題には関係ありませんが、修正が必要な次のバグになる可能性が高いので、注意してください。 – Pablo

答えて

4

だから、根本的な問題は、エラーメッセージが暗示されたまさにですは関数オブジェクトであるため、関数オブジェクトです。注:

one_thing = Thing() 
for i in range(2): 
    list_of_things.get_thing(one_thing.give_a_thing) 

はそのone_thing.give_a_thing戻り方法自体を実現、あなたは呼び出すメソッドたい:それはさておき

one_thing = Thing() 
for i in range(2): 
    list_of_things.get_thing(one_thing.give_a_thing()) 

を、このコードは非常に奇妙に構成されています。 give_a_thingはなぜ単にオブジェクト自体を返すのですか?つまり、list_of_thingsは、同じオブジェクトへの複数の参照を含むリストになります。

あなたははおそらく単にその後

class Thing: 
    def __init__(self, attribute1='y', attribute2='n'): 
     self.attribute1 = attribute1 
     self.attribute2 = attribute2 


class ThingOfThings: 
    def __init__(self, items=None): 
     if items is None: # watch out for the mutable default argument 
      items = [] 
     self.items = items 
    def add_thing(self, thing): # use a better name 
     self.items.append(thing) # don't create a needless intermediate, single-element list 

ような何かをしたい:

問題とは無関係の
list_of_things = ThingOfThings() 

for _ in range(2): # style tip: use _ if iterator variable is not used 
    list_of_things.add_thing(Thing()) # create *new* Thing each iteration 

print(list_of_things.items[0].attribute1) 
+0

ありがとうございます!メソッドを呼び出すことは私のために働いた。コードの構造に関しては、これは割り当てが実際にあらかじめ定義したものの非常に荒いバージョンでした。私は私のバージョンを作ったときにあまり考えなかった。再度、感謝します! – Sarchwalk

関連する問題