2017-07-19 4 views
2

私はPythonを学んで実験しています。 2番目の関数print_contactscontact_listを渡して、contact_listの名前を印刷できるようにするにはどうすればよいですか?私は何か間違っていると確信しています、なぜ誰もがそれを説明してくださいできますか?新しいクラスを設計するときに連絡先リストの内容を印刷する方法

class Contact(object): 
    contact_list = [] 

    def __init__(self, name, email): 
     self.name = name 
     self.email = email 
     return Contact.contact_list.append(self) 

# How to pass contact_list to below function? 

    def print_contacts(contact_list): 
     for contact in contact_list: 
      print(contact.name) 
+0

print_contacts(Contact.contact_list)、Pythonでコメントもあなたはそれが – arielnmz

+0

__init__メソッドがないクラスメソッドまたはいずれかの因子としての第2の機能をマークするアウト必要がある、 '#'ではない '//'でマークされています意味のある値を返します。ですから、基本的に 'Contact.contact_list.append(self)'を実行する必要があります。なぜなら 'return'は何も役に立たないからです。そして、list.append()はとにかく何も返しません。 –

答えて

1
class Contact(object): 
    contact_list = [] 

    def __init__(self, name, email): 
     self.name = name 
     self.email = email 
     Contact.contact_list.append(self) 

    @classmethod 
    def print_contacts(cls): 
     for contact in cls.contact_list: 
      print(contact.name) 

cont1 = Contact("John", "[email protected]") 
cont2 = Contact("Mary", "[email protected]") 
Contact.print_contacts() 

あなたのコードは、現在動作しない理由として、あなたの質問に答えるために

>>John 
    Mary 

を出力します:まず、あなたののinitメソッドが戻り呼び出しを必要としない、initは、オブジェクト変数を確立するためにオブジェクト作成時に呼び出され、通常は何も返す必要はありません(この場合、.append()は何も返さないため)。第二に、クラスメソッドは、2番目の方法でやろうとしているものに適しているようです。その詳細については、こちらを参照してください。What are Class methods in Python for?

+0

'@ classmethod'はクラスを第1引数として取ります。あなたは、あなたの意図がその提案にどのようなものであるかの完全な例を提供したいかもしれません。 – salparadise

+2

'print_contacts'をクラスメソッドにすると、もっときれいに実装する必要があります。 'def print_contacts(cls):cls.contact_listの連絡先:print(contact.name)' –

+0

良いアドバイス、Adam。ありがとう。 – SeeDerekEngineer

2

私にはContactオブジェクトも所有していても意味がありませんcontact_list属性であり、インスタンス化ではなくクラス全体の場合はさらに少なくなります。モデルContactオブジェクトを作成し、それらのすべてを表示する方法を知っているAddressBook、代わり

class Contact(object): 
    def __init__(self, name, email): 
     self.name = name 
     self.email = email 

    def __str__(self): 
     return f"{self.name} <{self.email}>" 
     # or "{} <{}>".format(self.name, self.email) in older versions of 
     # python that don't include formatted strings 


contacts = [] 

def print_contacts(contacts: "list of contacts") -> None: 
    for c in contacts: 
     print(c) 

adam = Contact("Adam Smith", "[email protected]") 
contacts.append(adam) 

bob = Contact("Bob Jones", "[email protected]") 
contacts.append(bob) 

charlie = Contact("Charlie Doe", "[email protected]") 
contacts.append(charlie) 

print_contacts(contacts) 
# Adam Smith <[email protected]> 
# Bob Jones <[email protected]> 
# Charlie Doe <[email protected]> 

をまたは:私の代わりにこれを行うだろう。

class AddressBook(list): 
    def add_contact(self, *args, **kwargs): 
     new_contact = Contact(*args, **kwargs) 
     self.append(new_contact) 

    def display_contacts(self): 
     for contact in self: 
      print(contact) 

contacts = AddressBook() 
contacts.add_contact("Adam Smith", "[email protected]") 
contacts.add_contact("Bob Jones", "[email protected]") 
contacts.add_contact("Charlie Doe", "[email protected]") 
contacts.display_contacts() 
+0

ちょうど楽しみ[in haskell](https://repl.it/J9iy) –

関連する問題