我正在学习Python中的绳索。当我尝试使用 Foobar
函数打印类 print()
的对象时,我得到如下输出:
<__main__.Foobar instance at 0x7ff2a18c>
有没有办法设置类及其对象的打印行为(或字符串表示) / em>的?例如,当我在类对象上调用print()
时,我想以某种格式打印其数据成员。如何在Python中实现这一点?
如果您熟悉C ++类,可以通过为类添加 ostream
方法来实现标准 friend ostream& operator << (ostream&, const Foobar&)
的上述操作
答案 0 :(得分:511)
>>> 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__
进行打印。
答案 1 :(得分:115)
As Chris Lutz mentioned,这是由您班级中的__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 shell中以下列方式运行:
>>> 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))
答案 2 :(得分:38)
可以应用于没有特定格式的任何类的通用方法可以按如下方式完成:
T(n) = 1 if n<1
T(n) = 4T(n-3) + 4T(n/2) if n>=1
= 4(4T(n-6) + 4T((n-3)/2)) + 4(4T(n/2 - 3) + 4T(n/4))
~ 4^2 (T(n-6) + T((n-3)/2) + T(n/2-3) + T(n/4))
然后,
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)
答案 3 :(得分:13)
只是将我的两分钱加到@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")
但是,正如我在上一篇评论中所说:更多信息只是here!
答案 4 :(得分:12)
您需要使用__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
答案 5 :(得分:9)
答案 6 :(得分:8)
对于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)
答案 7 :(得分:7)
@ 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__)))
答案 8 :(得分:1)
这个帖子已经有很多答案但是没有一个特别对我有帮助,我不得不自己解决,所以我希望这个答案能提供更多信息。
你必须确保在课程结束时有括号,例如:
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())
请注意,如果没有Hydrogen末端的括号,这将无效。他们是必要的。
希望这会有所帮助,如果您有任何疑问,请与我们联系。
答案 9 :(得分:1)
只需在您的课程中使用“__ str __”特殊方法。 对于前。
类Adiprogrammer:
def __init__(self, name):
self.company_name = name
def __str__(self):
return "I am the Founder of Adiprogrammer!"
yash = Adiprogrammer(“Aaditya”)
打印(佳日)
答案 10 :(得分:1)
.get()
Gets the most up-to-date result for this query.
Returns Promise<DataSnapshot>
A promise which resolves to the resulting DataSnapshot if a value is available,
or rejects if the client is unable to return a value
(e.g., if the server is unreachable and there is nothing cached).
.once()
Listens for exactly one event of the specified event type,
and then stops listening.
This is equivalent to calling on(), and then calling off() inside
the callback function.
和 __repr__
已在许多答案中提及。我只想补充一点,如果你懒得把这些魔法函数添加到你的类中,你可以使用objprint。一个简单的装饰器 __str__
将帮助您将 @add_objprint
方法添加到您的类中,您可以将 __str__
用于实例。当然,如果您愿意,您也可以使用库中的 print
函数以人类可读的格式打印任意对象。
objprint
输出就像
from objprint import add_objprint
class Position:
def __init__(self, x, y):
self.x = x
self.y = y
@add_objprint
class Player:
def __init__(self):
self.name = "Alice"
self.age = 18
self.items = ["axe", "armor"]
self.coins = {"gold": 1, "silver": 33, "bronze": 57}
self.position = Position(3, 5)
print(Player())
答案 11 :(得分:0)
简单。在打印中,执行:
print(foobar.__dict__)
只要构造函数是
__init__