2016-11-20 17 views
1

だから私は、次の機能があります。オブジェクトクラスをリストに追加するにはどうすればよいですか?

def find_by_name(self, name): 
    fitting_list = [p for p in self.__persons if name.lower() in p.name.lower()] 
    return fitting_list 

をそして、私はリストを印刷するとき、私は次の出力を得る:

[<src.store.domain.person.Person object at 0x000001F88705B128>] 

は、なぜこれが起こるんし、どのように私はそれを修正することができますか?

+0

は、あなたの代わりに何を期待していますか? –

+0

if条件に関してオブジェクトのリストを出力することを期待しています。私は__str__メソッドを実装しました。十分ではありませんか? – Binary

+0

そうです。 1つのPersonオブジェクトを含むリストを出力します。 Pythonがオブジェクトを出力するデフォルトの方法がわかります。 –

答えて

1

listあなたのクラスが__str__メソッドを持っているかどうかは関係ありません。

オブジェクトを印刷すると、printはオブジェクトにstrを呼び出し、適切な文字列を取得します。 str関数は、オブジェクトの__str__メソッドを呼び出そうとしますが、の場合は、オブジェクトの__repr__メソッドを呼び出します。そのオブジェクトのクラス定義内にある__repr__の定義でない場合は、親クラスから継承されたものを取得します。通常は、objectタイプのデフォルト__repr__になります。

listとビルトインtuplesetdictなどのコレクション__str__方法を持っていない他の、あなたは、文字列に変換してみてください(明示的str機能を使用して、または暗黙的にprintのいずれかを介して)その__repr__メソッドが呼び出されます。そして、それらの__repr__メソッドは、コレクション内の各アイテムに対してreprを呼び出します。したがって、コレクションオブジェクトのいずれかをprintに渡すと、アイテムのうち__repr__が常に表示されます。そして明白にコレクションにstrを呼び出すことは違いにはなりません。

listまたはコレクションにあるアイテムの__str__の表示を確認するには、各アイテムについて明示的にstrを呼び出してコレクションを繰り返し処理する必要があります。

ここには、これらの点を示す小さなコードスニペット(Python 2 & 3に適しています)があります。出力

3075508812 3075508812 
[Test repr, Test repr] [Test repr, Test repr] [Test repr, Test repr] 
Test str Test str Test repr 
Test str Test str Test repr 

from __future__ import print_function 

class Test(object): 
    def __str__(self): 
     return 'Test str' 
    def __repr__(self): 
     return 'Test repr' 

a = [Test(), Test()] 
print(id(a.__repr__), id(a.__str__)) 
print(a, str(a), repr(a)) 

for u in a: 
    print(u, str(u), repr(u)) 

ですから、単一のエンティティとしてあなたのオブジェクトのリストを印刷できるようにしたいと、オブジェクトの文字列は、より人に優しいことがあれば、あなたはいくつかあります選択肢の:

  1. 変更__repr__にご__str__メソッドの名前。これは最も簡単な方法です。前述のように、オブジェクトがstrに渡されたときに__str__が見つからない場合、__repr__が使用されます。

  2. 既存の__str__メソッドだけを残して、より人間に優しい__repr__を作成します。しかし、__repr__は有用な情報をプログラマーに表示し、実際には__repr__文字列をコピーして&のコピーをインタプリタまたはスクリプトに貼り付けてオブジェクトを再作成するとよいと示唆されています。

  3. __str__メソッドだけを残して、__str__を呼び出す__repr__を作成します。有効だが、これはちょっとばかげている。関連する戦略は__str__を参照するクラス属性として__repr__を設定することです。以下の例を参照してください。

​​
+0

ありがとうございます。これは、私が見つけた他のチュートリアルよりも__str__ methocをよく理解してくれました。 – Binary

3

これはオブジェクトのちょうど__repr__です。 __repr__は、オブジェクトを機械で読み取ることができるように意図されており、オブジェクトを上書きして変更することができます。

関連する問題