2012-02-14 10 views
2

このクラスの関数で作成されたリストを印刷しようとしていますが、何を修正する必要がありますか?私は[<__main__.Person instance at 0x1004a0320>,の行に沿って端末から出力を得ています。クラス内の関数のPythonリスト

class Person: 
    def __init__(self,first,last,id,email): 
     self.firstName=first 
     self.lastName=last 
     self.id=id 
     self.email=email 
     self.friends=[] 
    def add_friend(self,friend): 
     if len(self.friends)<5: 
      self.friends.append(friend) 
     if len(friend.friends)<5: 
      friend.friends.append(self) 

p1=Person("David","Waver","922-43-9873","[email protected]") 
p2=Person("Bob","Jones","902-38-9973","[email protected]") 
p3=Person("James","Smith","302-38-9103","[email protected]") 
p4=Person("Tim","Jack","902-38-0918","[email protected]") 
p5=Person("Jim","Johnston","314-78-2343","[email protected]") 
p6=Person("Gina","Relent","102-38-1064","[email protected]") 
p7=Person("Greg","Morris","932-38-4473","[email protected]") 

p1.add_friend(p2) 
p1.add_friend(p3) 
p1.add_friend(p4) 
p1.add_friend(p5) 
p1.add_friend(p6) 
p1.add_friend(p7) 

print p1.friends 
+1

人物や名前(またはその他の詳細)を印刷しようとしていますか? –

+0

私はクラスについて学び始めました。いろいろな 'person'インスタンスの属性を' friends'リストに入れることがここの目標でした。どうしたのかは本当に私が心配していることではありません。 – ZCJ

+1

実際には友達リストに人物オブジェクトを追加しています。したがって、リストを印刷しようとすると、 ''のリストがシェルに表示されます。 personオブジェクトの属性を出力するには、personクラスで '__repr__'または' __str__'を定義する必要があります。詳細については、senderleの答えを参照してください。 –

答えて

7

あなたPersonクラスで__repr__または__str__を定義する必要があります。

>>> class Person: 
...  def __init__(self,first,last,id,email): 
...   self.firstName=first 
...   self.lastName=last 
...   self.id=id 
...   self.email=email 
...   self.friends=[] 
...  def add_friend(self,friend): 
...   if len(self.friends)<5: 
...    self.friends.append(friend) 
...   if len(friend.friends)<5: 
...    friend.friends.append(self) 
...  def __repr__(self): 
...   return self.firstName + ' ' + self.lastName 

はその後

>>> print p1.friends 
[Bob Jones, James Smith, Tim Jack, Jim Johnston, Gina Relent] 

このanswer

は、これらの機能の良い説明を与える...上記のようにリストを初期化します。おそらく __repr__がより次のようになり、 __repr____str__の機能に関する上記の投稿のポイントを考えると

:上約うれしいです

def __repr__(self): 
    template = "Person('{0}', '{1}', '{2}', '{3}')" 
    return template.format(self.firstName, self.lastName, self.id, self.email) 

何が、それが評価され、文字列を生成していることである作成します元のオブジェクトと同じプロパティ(friendsは別)を持つオブジェクトです。例:

>>> print p1 
Person('David', 'Waver', '922-43-9873', '[email protected]') 
>>> Person('David', 'Waver', '922-43-9873', '[email protected]') 
Person('David', 'Waver', '922-43-9873', '[email protected]') 
+0

リンクをありがとう。したがって、 'friends'は、クラスのadd_friend関数を経由して追加されたすべてのオブジェクトで構成されますが、それらをリストに出力するには、ある時点で返す必要がありますか? しかし、 'p1 = person()'を作成した場合、 'p1.firstname = "David" 'p1.firstname'を出力できます。だから、 '__repr__'の下で返されたという事実は、完全な目標ではないようです。あなたが投稿したリンクを読んでいきます。 – ZCJ

+2

@ZCJ、そうではありません。彼らはあなたが提供したコードで「印刷されています」。オブジェクトを 'print'すると' __repr__'メソッドが呼び出され、返された文字列がオブジェクトの表現として使われます。 ' 'は、デフォルトの' __repr__'関数が返すものです。最後の16進数はオブジェクトのメモリアドレスです。 (これは 'hex(id(p1)) 'によって返されるものと同じものです)。カスタムクラスの場合、Pythonはあなたが正しく見えるようにするためにあなた自身の '__repr__'を提供することを期待しています。そうでない場合は、単にデフォルトを使用します。 – senderle

+0

したがって、Pythonのデフォルトはオブジェクトがクラスを通過するときのメモリアドレスですか?関数を経由するオブジェクトに '__repr__'を使わなければならないのはなぜですか? – ZCJ

1

クラスには__repr__メソッドを定義する必要があります。たとえば、次のようになります。

class Person: 
    def __repr__(self): 
     return '%s, %s, %s, %s' %(self.firstName, self.lastName, self.id, 
            self.email) 
3

オブジェクトの表現は、__repr__()メソッドから返された文字列で与えられます。オブジェクト自体が印刷されるときに表示される文字列は、__str__()メソッドから返される文字列です。フレームワークは、オブジェクトを表示するために__unicode__()メソッドによって返された文字列を使用することがあります。

class Person: 
    ... 
    def __repr__(self): 
    return 'Person: %s, %s' % (self.lastName, self.firstName) 
関連する問題