当我试图打印一个类的实例时,我得到了这样的输出:

>>> class Test():
...     def __init__(self):
...         self.a = 'foo'
...
>>> print(Test())
<__main__.Test object at 0x7fc9a9e36d60>

我如何使它打印将显示自定义的东西(例如,包括属性值的东西)?也就是说,我如何才能定义类的实例在打印时将如何出现(他们的字符串表示)?


参见如何为类本身(而不是类的实例)选择自定义字符串表示?如果你想为类本身定义行为(在这种情况下,print(Test)显示一些自定义的东西,而不是<class __main__。测试>或类似)。(事实上,技术本质上是相同的,但应用起来更棘手。)


当前回答

只是对@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")

但是,正如我在上一条评论中所说的:更多信息就在这里!

其他回答

>>> 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()函数(或当你用交互式提示符查看它时)时发生的方法。

如果没有给出__str__方法,Python将打印__repr__的结果。如果你定义了__str__而不是__repr__, Python将使用上面所看到的__repr__,但仍然使用__str__进行打印。

在这个帖子里已经有很多答案了,但没有一个对我有特别的帮助,我必须自己解决,所以我希望这个帖子能提供更多的信息。

你只需要确保在你的课结束时有括号,例如:

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}

只是对@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