如何使用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”)

打印(佳日)