当我试图打印一个类的实例时,我得到了这样的输出:
>>> class Test():
... def __init__(self):
... self.a = 'foo'
...
>>> print(Test())
<__main__.Test object at 0x7fc9a9e36d60>
我如何使它打印将显示自定义的东西(例如,包括属性值的东西)?也就是说,我如何才能定义类的实例在打印时将如何出现(他们的字符串表示)?
参见如何为类本身(而不是类的实例)选择自定义字符串表示?如果你想为类本身定义行为(在这种情况下,print(Test)显示一些自定义的东西,而不是<class __main__。测试>或类似)。(事实上,技术本质上是相同的,但应用起来更棘手。)
正如Chris Lutz解释的那样,这是由类中的__repr__方法定义的。
来自repr()的文档:
对于许多类型,此函数尝试返回一个字符串,该字符串在传递给eval()时将产生一个具有相同值的对象,否则表示为尖括号括起来的字符串,其中包含对象类型的名称以及通常包括对象名称和地址的附加信息。类可以通过定义__repr__()方法来控制该函数为其实例返回的内容。
给定以下类Test:
class Test:
def __init__(self, a, b):
self.a = a
self.b = b
def __repr__(self):
return f"<Test a:{self.a} b:{self.b}>"
def __str__(self):
return f"From str method of Test: a is {self.a}, b is {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):
cls = self.__class__
return f"<{cls.__module_}.{cls.__qualname__} object at {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}
在这个帖子里已经有很多答案了,但没有一个对我有特别的帮助,我必须自己解决,所以我希望这个帖子能提供更多的信息。
你只需要确保在你的课结束时有括号,例如:
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())
请注意,如果没有氢原子后面的括号,这将不起作用。它们是必要的。
希望这对你有所帮助,如果你还有其他问题,请告诉我。