无法在python中实现__repr __()方法的实现

时间:2019-10-23 21:01:47

标签: python python-3.x class methods tuples

我正在阅读David Beazley和Brian K. Jones着名的有关python的著名书籍“ python cookbook”。在“类和对象”一章中,他们编写了以下代码:

class Point:
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def __repr__(self):
        return 'Point({0.x!r}, {0.y!r})'.format(self)
    def __str__(self):
        return '({0.x!s}, {0.y!s})'.format(self)

现在,只有我了解到, repr ()方法用于向开发人员表示对象,而 str ()用于向盲用户表示对象。但是在这两种方法中,“返回”之后会发生什么?肯定有两种情况下都有元组。但是元组有什么样的成员?我以前从未见过这样的东西。

3 个答案:

答案 0 :(得分:2)

示例中的<ion-content> <div style="height:100%; background-color: red; overflow: overlay"> <p> This is some content </p> <p> This is some content </p> <p> This is some content </p> <p> This is some content </p> <p> This is some content </p> <p> This is some content </p> <p> This is some content </p> <p> This is some content </p> <p> This is some content </p> <p> This is some content </p> </div> </ion-content> __repr__都返回格式化的字符串,而不是元组。在对象上显式或隐式调用__str__repr()时,将调用这些函数。

例如,str()将打印print(Point(1,2))的结果,因为它在内部对对象调用__str__,但是str()将打印{{1}的结果}。

对于您自己的对象,这些方法可以返回您想要的任何内容,只要它们只是字符串即可。

答案 1 :(得分:1)

以下是特定formatting syntax的细目分类。使用str.format方法,您可以在给定的字符串实例中以{...}的形式填充占位符。这些通过以下方式与位置参数一起使用:

>>> '{}:{}'.format(1, 2)
'1:2'
>>> '{0}:{1}'.format(1, 2)
'1:2'
>>> '{1}:{0}'.format(1, 2)
'2:1'

这意味着您可以在花括号内指定位置参数的编号。该字符串可以多次引用位置参数:

>>> '{0}:{1}:{0}'.format(1, 2)
'1:2:1'

使用.x表示法,您可以访问该参数的属性。例如:

>>> class Test:
...     x = 1
...     y = 2
... 
>>> '{0.x}:{0.y}'.format(Test)
'1:2'

使用!r可以强制使用该对象的__repr__而不是__str__。例如:

>>> class Test:
...     def __str__(self):
...         return '__str__'
...     def __repr__(self):
...         return '__repr__'
... 
>>> '{0}'.format(Test())
'__str__'
>>> '{0!s}'.format(Test())
'__str__'
>>> '{0!r}'.format(Test())
'__repr__'

因此,结合所有这些信息,我们将得到以下信息:

'Point({0.x!r}, {0.y!r})'.format(self)

此处定义了带有两个占位符的格式字符串({0.x!r}{0.y!r})。它们应使用第一个位置参数的xy属性填充(回想起{0}将被第一个参数替换,因此{0.x}请求{{1} }该参数的属性)。最后,x请求该对象的!r而不是__repr__(这是默认设置)。

相同的推理适用于__str__方法。

顺便说一句,格式化语法还允许关键字参数,并且可以通过名称来引用它们:

__str__

答案 2 :(得分:0)

您可能想在解释器中尝试一下,看看发生了什么事情

core dev 1555:0> my_json = '{ "name":"John", "age":30, "car":null }'
=> "{ \"name\":\"John\", \"age\":30, \"car\":null }"
core dev 1556:0> puts JSON.pretty_generate(JSON.parse(my_json))
{
  "name": "John",
  "age": 30,
  "car": null
}
=> nil