如何使用print()打印类或类的对象?
我正在学Python的绳索。 当我尝试使用print()函数print() Foobar类的对象时,我得到如下输出: 
 <__main__.Foobar instance at 0x7ff2a18c> 
 有没有办法可以设置类和它的对象的打印行为 (或string表示 )? 例如,当我在类对象上调用print()时,我想以某种格式打印它的数据成员。 如何在Python中实现这一点? 
 如果您熟悉C ++类,可以通过为类添加friend ostream& operator << (ostream&, const Foobar&)方法来实现标准ostream 。 
 >>> 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()的文档: 
对于很多types来说,这个函数试图返回一个string,当传递给
eval()时会返回一个相同值的对象,否则表示就是一个用尖括号括起来的string,它包含了对象types的名字附加信息通常包括对象的名称和地址。 一个类可以通过定义一个__repr__()方法来控制这个函数为其实例返回的__repr__()。
鉴于以下课程testing:
 class Test: def __init__(self, a, b): self.a = a self.b = b def __repr__(self): return "<Test a:%sb:%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)) 
 你需要使用__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 
只要将我的两分钱添加到@dbr的答案中,下面是一个如何从他引用的官方文档中实现这个句子的例子:
“[…]返回一个string,当传递给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=%sb=%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") 
但是,正如我在最后的评论中所说:更多信息就在这里 !
如果没有特定的格式,可以应用于任何类的通用方法如下:
 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:
如果特定的格式不重要(如debugging),只需从下面的Printable类inheritance。 不需要为每个对象编写代码。
受到这个答案的启发
 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) 
在这个线程中已经有很多答案,但是他们没有一个对我有特别的帮助,我不得不自己去解决,所以我希望这个能够提供更多的信息。
你只需要确保在课堂结束时有括号,例如:
 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”)
打印(佳日)