Как печатать объекты класса с помощью print ()?
Я изучаю веревки в Python. Когда я пытаюсь напечатать объект класса Foobar С помощью print() функция, я получаю такой вывод:
<__main__.Foobar instance at 0x7ff2a18c>
есть ли способ я могу установить печать поведения (или строковое представление) из класс и объекты? Например, когда я звоню print() на объекте класса я хотел бы напечатать его элементы данных в определенном формат. Как добиться этого в Python?
если вы знакомы с классами C++, выше может быть достигнуто для стандарта ostream добавить friend ostream& operator << (ostream&, const Foobar&) метод для класса.
10 ответов:
>>> class Test: ... def __repr__(self): ... return "Test()" ... def __str__(self): ... return "member of Test" ... >>> t = Test() >>> t Test() >>> print(t) member of TestThe
__str__метод-это то, что происходит, когда вы печатаете его, и__repr__способ что происходит, когда вы используетеrepr()
как упоминал Крис Лутц, это определяется
__repr__метод в вашем классе.из документации
repr():для многих типов эта функция делает попытку вернуть строку, которая дала бы объект с тем же значением при передаче в
eval(), в противном случае представление является строкой, заключенной в угловые скобки, которая содержит имя типа объекта вместе с дополнительными информация часто включает в себя имя и адрес объекта. Класс может управлять тем, что эта функция возвращает для своих экземпляров, определяя__repr__()метод.учитывая следующий тест класса:
class Test: def __init__(self, a, b): self.a = a self.b = b def __repr__(self): return "<Test a:%s b:%s>" % (self.a, self.b) def __str__(self): return "From str method of Test: a is %s, b is %s" % (self.a, self.b)..он будет действовать следующим образом в оболочке Python:
>>> t = Test(123, 456) >>> t <Test a:123 b:456> >>> print repr(t) <Test a:123 b:456> >>> print(t) From str method of Test: a is 123, b is 456 >>> print(str(t)) From str method of Test: a is 123, b is 456, если не
__str__метод определен,print(t)(илиprint(str(t))) будет использовать результат__repr__вместо, если не
__repr__метод определяется тогда по умолчанию используется, что в значительной степени эквивалентно..def __repr__(self): return "<%s instance at %s>" % (self.__class__.__name__, id(self))
общий способ, который может быть применен к любому классу без определенного форматирования, может быть выполнен следующим образом:
class Element: def __init__(self, name, symbol, number): self.name = name self.symbol = symbol self.number = number def __str__(self): return str(self.__class__) + ": " + str(self.__dict__)и затем
elem = Element('my_name', 'some_symbol', 3) print(elem)производит
__main__.Element: {'symbol': 'some_symbol', 'name': 'my_name', 'number': 3}
просто чтобы добавить мои два цента к ответу @dbr, ниже приведен пример того, как реализовать это предложение из официальной документации, которую он процитировал:
" [...] чтобы вернуть строку, которая даст объект с тем же значением при передаче в eval(), [...]"
учитывая это определение класса:
class Test(object): def __init__(self, a, b): self._a = a self._b = b def __str__(self): return "An instance of class Test with state: a=%s b=%s" % (self._a, self._b) def __repr__(self): return 'Test("%s","%s")' % (self._a, self._b)теперь, легко сериализовать экземпляр
Testкласс:x = Test('hello', 'world') print 'Human readable: ', str(x) print 'Object representation: ', repr(x) print y = eval(repr(x)) print 'Human readable: ', str(y) print 'Object representation: ', repr(y) printИтак, запустив последний фрагмент кода, мы будем получить:
Human readable: An instance of class Test with state: a=hello b=world Object representation: Test("hello","world") Human readable: An instance of class Test with state: a=hello b=world Object representation: Test("hello","world")но, как я уже сказал в своем последнем комментарии: больше информации просто здесь!
вы должны использовать
__repr__. Это стандартная функция типа__init__. Например:class Foobar(): """This will create Foobar type object.""" def __init__(self): print "Foobar object is created." def __repr__(self): return "Type what do you want to see here." a = Foobar() print a
Для Python 3:
Если конкретный формат не важен (например, для отладки), просто наследуйте от класса Printable ниже. Нет необходимости писать код для каждого объекта.
вдохновленный этой ответ
class Printable: def __repr__(self): from pprint import pformat return "<" + type(self).__name__ + "> " + pformat(vars(self), indent=4, width=1) # Example Usage class MyClass(Printable): pass my_obj = MyClass() my_obj.msg = "Hello" my_obj.number = "46" print(my_obj)
более красивая версия ответа от @user394430
class Element: def __init__(self, name, symbol, number): self.name = name self.symbol = symbol self.number = number def __str__(self): return str(self.__class__) + '\n'+ '\n'.join(('{} = {}'.format(item, self.__dict__[item]) for item in self.__dict__)) elem = Element('my_name', 'some_symbol', 3) print(elem)производит визуально хороший список имен и значений.
<class '__main__.Element'> name = my_name symbol = some_symbol number = 3еще более причудливая версия (Спасибо Ruud) сортирует предметы:
def __str__(self): return str(self.__class__) + '\n' + '\n'.join((str(item) + ' = ' + str(self.__dict__[item]) for item in sorted(self.__dict__)))
в этой теме уже есть много ответов, но ни один из них особенно не помог мне, я должен был сам разобраться, поэтому я надеюсь, что этот немного более информативен.
вы просто должны убедиться, что у вас есть скобки в конце вашего класса, например:
print(class())вот пример кода из проекта, над которым я работал:
class Element: def __init__(self, name, symbol, number): self.name = name self.symbol = symbol self.number = number def __str__(self): return "{}: {}\nAtomic Number: {}\n".format(self.name, self.symbol, self.number class Hydrogen(Element): def __init__(self): super().__init__(name = "Hydrogen", symbol = "H", number = "1")для печати моего класса водорода я использовал следующее:
print(Hydrogen())обратите внимание, это не будет работать без скобок в конце водорода. Они необходимы.
надеюсь, что это поможет, дайте мне знать, если у вас есть еще вопросы.
просто использовать " _ _ str__" специальный метод внутри класса. Например.
класс Adiprogrammer:
def __init__(self, name): self.company_name = name def __str__(self): return "I am the Founder of Adiprogrammer!"yash = Adiprogrammer ("Aaditya")
print (yash)
ничего из этого мне не помогает. Я не хочу изменять определение моего исходного объекта только для того, чтобы получить печать. IOW: я не хочу использовать наследование или даже поставить эти str функции в моем классе. Это означало бы, что мне придется изменить каждый класс, который я хочу отладить. Вместо этого я бы предпочел иметь класс и распечатать все содержимое класса. IOW: есть что-то вроде
class Address( ): __init__( self ) self.mName = 'Joe' self.mAddress = '123 Easy Street' a = Address() print a or print printClass( a )это будет печатать что-то вроде:
Class Address contains: mName = 'Joe' mAddress = '123 Easy Street'хороший и простой на использование и идея, где мне не нужно менять исходные определения объектов. Если мне нужно создать небольшую функцию, которая деконструирует объект, я был бы в порядке с этим. Так как я могу просто вызвать функцию, которая знает, как это сделать. Я могу использовать его встроенным без изменения исходного определения классов.
Comments