关于python:如何使用print()打印类的对象?

How to print objects of class using print()?

我在学Python的绳索。当我尝试使用print()函数打印类Foobar的对象时,我得到如下输出:

1
<__main__.Foobar instance at 0x7ff2a18c>

有没有一种方法可以设置类及其对象的打印行为(或字符串表示)?例如,当我在类对象上调用print()时,我希望以某种格式打印它的数据成员。如何在Python中实现这一点?

如果您熟悉C++类,可以通过为类添加EDCOX1×4的方法来实现标准EDOCX1 3。


1
2
3
4
5
6
7
8
9
10
11
>>> 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()函数(或使用交互提示查看时)时发生的。如果这不是最简单的Python疗法,我道歉,因为我仍然在学习-但它是有效的。

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


正如ChrisLutz所提到的,这是由类中的__repr__方法定义的。

根据repr()文件:

For many types, this function makes an attempt to return a string that would yield an object with the same value when passed to eval(), otherwise the representation is a string enclosed in angle brackets that contains the name of the type of the object together with additional information often including the name and address of the object. A class can control what this function returns for its instances by defining a __repr__() method.

进行以下等级测试:

1
2
3
4
5
6
7
8
9
10
class Test:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __repr__(self):
        return"<Test a:%s b:%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中的作用如下:

1
2
3
4
5
6
7
8
9
>>> 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__方法,则使用默认值,相当于..

1
2
def __repr__(self):
    return"<%s instance at %s>" % (self.__class__.__name__, id(self))


一种可以应用于任何没有特定格式的类的通用方法可以如下所示:

1
2
3
4
5
6
7
8
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__)

然后,

1
2
elem = Element('my_name', 'some_symbol', 3)
print(elem)

生产

1
__main__.Element: {'symbol': 'some_symbol', 'name': 'my_name', 'number': 3}


只需在@dbr的答案中加上我的两分钱,以下是如何从他引用的官方文档中实现这句话的示例:

"[...] to return a string that would yield an object with the same value when passed to eval(), [...]"

给定此类定义:

1
2
3
4
5
6
7
8
9
10
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类的实例:

1
2
3
4
5
6
7
8
9
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

所以,运行最后一段代码,我们将得到:

1
2
3
4
5
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__的标准函数。例如:

1
2
3
4
5
6
7
8
9
10
11
12
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


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

1
print a.__dict__

它违背了我认为的好样式,但如果您只是尝试调试,那么它应该做您想要的。


对于Python 3:

如果特定格式不重要(例如用于调试),只需从下面的可打印类继承。不需要为每个对象编写代码。

灵感来源于这个答案

1
2
3
4
5
6
7
8
9
10
11
12
13
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)

@user394430提供的更漂亮的响应版本

1
2
3
4
5
6
7
8
9
10
11
12
13
class Element:
    def __init__(self, name, symbol, number):
        self.name = name
        self.symbol = symbol
        self.number = number

    def __str__(self):
        return  str(self.__class__) + '
'
+ '
'
.join(('{} = {}'.format(item, self.__dict__[item]) for item in self.__dict__))

elem = Element('my_name', 'some_symbol', 3)
print(elem)

生成名称和值的外观良好的列表。

1
2
3
4
<class '__main__.Element'>
name = my_name
symbol = some_symbol
number = 3

一个更高级的版本(谢谢鲁德)对这些项目进行了分类:

1
2
3
4
def __str__(self):
    return  str(self.__class__) + '
'
+ '
'
.join((str(item) + ' = ' + str(self.__dict__[item]) for item in sorted(self.__dict__)))

只需在类内使用"uu str_uuu"特殊方法。为Ex.

一级程序员:

1
2
3
4
5
def __init__(self, name):
    self.company_name = name

def __str__(self):
    return"I am the Founder of Adiprogrammer!"

yash=adiProgrammer("aaditya")。

打印(YASH)


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

你只需要确保你在课后有括号,例如:

1
print(class())

下面是我正在处理的一个项目的代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Element:
    def __init__(self, name, symbol, number):
        self.name = name
        self.symbol = symbol
        self.number = number
    def __str__(self):
        return"{}: {}
Atomic Number: {}
"
.format(self.name, self.symbol, self.number

class Hydrogen(Element):
    def __init__(self):
        super().__init__(name ="Hydrogen", symbol ="H", number ="1")

为了打印我的氢类,我使用了以下方法:

1
print(Hydrogen())

请注意,如果没有氢结尾的括号,这将不起作用。它们是必要的。

希望这有帮助,如果你还有问题,请告诉我。


这些对我都没有真正的帮助。我不想为了打印而更改原始对象的定义。我不想使用继承,甚至不想把这些str函数放到我的类中。这意味着我必须更改所有要调试的类。相反,我宁愿有一个班级,打印出整个班级的内容。有点像

1
2
3
4
5
6
7
8
9
class Address( ):
  __init__( self )
     self.mName = 'Joe'
     self.mAddress = '123 Easy Street'

a = Address()
print a
or
print printClass( a )

这将打印如下内容:

1
2
3
 Class Address contains:
   mName = 'Joe'
   mAddress = '123 Easy Street'

在用法和一个不需要更改原始对象定义的想法上很好和简单。如果我必须创建一个解构对象的小函数,我会同意的。因为我可以简单地调用知道如何做的函数。我可以在不更改原始类定义的情况下直接使用它。