Как печатать объекты класса с помощью print ()?
Я изучаю веревки в Python. Когда я пытаюсь напечатать объект класса Foobar
С помощью print()
функция, я получаю такой вывод:
<__main__.Foobar instance at 0x7ff2a18c>
есть ли способ установить печать поведения (или строковое представление) of a класс и объекты? Например, когда я звоню 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 Test
на __str__
метод-это то, что происходит при его печати, и __repr__
способ что происходит, когда вы используете repr()
функция (или когда вы смотрите на нее с помощью интерактивной подсказки). Если это не самое весть метод, я прошу прощения, потому что я все еще учусь, но он работает.
, если не __str__
метод задан, Python будет печатать результат __repr__
вместо. Если вы определяете __str__
а не __repr__
, Python будет использовать то, что вы видите выше как __repr__
, но все же использовать __str__
для печати.
как упоминал Крис Лутц, это определяется __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__)))
в этой теме уже много ответов, но ни один из них мне особенно не помог, я должен был сам разобраться, поэтому я надеюсь, что этот немного более информативен.
вы просто должны убедиться, что у вас есть круглые скобки в конце вашего класса, e.g:
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!"
Яш = Adiprogrammer("Адитья")
печать(Яш)
ничто из этого мне не помогает. Я не хочу изменять определение моего исходного объекта только для печати. 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'
славный и простой на использование и идея, где мне не нужно изменять исходные определения объектов. Если мне нужно создать небольшую функцию, которая деконструирует объект, я буду в порядке с этим. Поскольку я могу просто вызвать функцию, которая знает, как это сделать. Я могу использовать его inline без изменения исходного определения классов.