Поиск в классах AddressBook
использует регулярное выражение, чтобы найти строку, соответствующую шаблону, который является именем.Зачем мне нужно 2 метода __str__ для печати?
self.contacts
петли через Contact
класса и выводит из шаблона в словаре формате
import re
import sys
class Contact(object):
def __init__(self, match):
for key, value in match.groupdict().items():
setattr(self, key, value)
def __str__(self):
return '\n'.join(
sorted(
["\t{}: {}".format(key, val) for key, val in self.__dict__.items()]))
class AddressBook(object):
def __init__(self, filename):
self.names_file = open(filename, encoding="utf-8")
self.data = self.names_file.read()
self.names_file.close()
line = re.compile('(?P<name>^([A-Z][a-z]*((\s)))+[A-Z][a-z]*$)')
self.contacts = [Contact(match) for match in line.finditer(self.data)]
address_book = AddressBook('contacts.txt')
print (address_book)
Это даст мне питона объект:
<__main__.AddressBook object at 0x0338E410>
Но если добавить еще один __str__
метод, как это ...
import re
import sys
class Contact(object):
... #same code as above
class AddressBook(object):
def __init__(self, filename):
self.names_file = open(filename, encoding="utf-8")
self.data = self.names_file.read()
self.names_file.close()
line = re.compile('(?P<name>^([A-Z][a-z]*((\s)))+[A-Z][a-z]*$)')
self.contacts = [Contact(match) for match in line.finditer(self.data)]
def __str__(self):
return '\n'.join('{}'.format(i) for i in self.contacts)
address_book = AddressBook('contacts.txt')
print (address_book)
It ac tually печатает его:
name: Rick James
name: Charlie Murphy
name: Prince
Мой вопрос, почему он дает мне объект питона, даже если у меня есть метод __str__
в Contact
классе?
Потому что вы печатаете «Адресную книгу», а не «Контакт»? –
Есть ли другой способ сделать это, не прибегая к методам 2 '__str__'? – dyao
@bLunt Вы можете выполнять всю работу в методе 'Адресная книга .__ str __()' и форматировать все экземпляры 'Contact', которые там содержатся, но, вероятно, лучше сохранить логику в двух методах' __str __() 'let каждый объект несет ответственность за свое собственное читаемое представление. – plamut