我正在学习Python中的绳索。 当我尝试使用print()
函数print()
Foobar
类的对象时,得到如下输出:
<__main__.Foobar instance at 0x7ff2a18c>
有没有办法设置类及其对象的打印行为 (或字符串表示形式 )? 例如,当我在类对象上调用print()
时,我想以某种格式打印其数据成员。 如何在Python中实现?
如果您熟悉C ++类,则可以通过为该类添加friend ostream& operator << (ostream&, const Foobar&)
方法来实现上述标准ostream
。
只需在@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
>>> 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()
函数(或使用交互式提示查看它)时发生的情况。 如果这不是最Pythonic的方法,我深表歉意,因为我也在学习-但这确实可行。
如果没有给出__str__
方法,Python将打印__repr__
的结果。 如果您定义__str__
而不是__repr__
,Python将使用您在上面看到的__repr__
,但仍然使用__str__
进行打印。
正如Chris Lutz所提到的 ,这是由类中的__repr__
方法定义的。
从repr()
的文档中:
对于许多类型,此函数尝试返回一个字符串,该字符串在传递给
eval()
时将产生具有相同值的对象,否则表示形式是一个用尖括号括起来的字符串,其中包含该对象的类型名称以及通常包括对象名称和地址的其他信息。 一个类可以通过定义__repr__()
方法来控制此函数为其实例返回的__repr__()
。
给定以下类Test:
class Test:
def __init__(self, a, b):
self.a = a
self.b = b
def __repr__(self):
return "" % (self.a, self.b)
def __str__(self):
return "From str method of Test: a is %s, b is %s" % (self.a, self.b)
..it在Python Shell中的行为如下:
>>> t = Test(123, 456)
>>> t
>>> print repr(t)
>>> 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))
这个线程中已经有很多答案,但是没有一个对我有特别的帮助,我必须自己解决这个问题,因此我希望这个答案能提供更多信息。
您只需要确保在课程结束时有括号即可,例如:
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")
要打印我的Hydrogen类,我使用了以下内容:
print(Hydrogen())
请注意,如果没有氢末的括号,这将无法正常工作。 它们是必需的。
希望这会有所帮助,如果您还有其他问题,请告诉我。
可以按以下方式完成可应用于任何类而无需特定格式的通用方法:
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}
对于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)
只需在您的类中使用“ __str__”特殊方法。 对于前。
Adiprogrammer类:
def __init__(self, name):
self.company_name = name
def __str__(self):
return "I am the Founder of Adiprogrammer!"
yash = Adiprogrammer(“ Aaditya”)
打印(yash)
@ 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)
产生视觉上漂亮的名称和值列表。
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__)))
如果遇到类似@Keith的情况,可以尝试:
print a.__dict__
它违背了我认为好的样式,但是如果您只是尝试调试,那么它应该可以做您想要的。