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

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

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


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


当前回答

你需要使用__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

其他回答

你需要使用__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

一个通用的方法,可以应用到任何类没有特定的格式,可以这样做:

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:

如果特定的格式不重要(例如调试),可以从下面的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)

简单。在打印时,请:

print(foobar.__dict__)

只要构造函数是

__init__

如果你遇到@Keith这样的情况,你可以试试:

print(a.__dict__)

它违背了我认为好的风格,但如果你只是试图调试,那么它应该做你想要的。