首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在python中实现__repr__()方法

无法在python中实现__repr__()方法
EN

Stack Overflow用户
提问于 2019-10-23 21:01:47
回答 3查看 66关注 0票数 3

我在读大卫·比兹利和布赖恩·K·琼斯关于蟒蛇的著名著作“蟒蛇食谱”。在“类和对象”一章中,他们编写了以下代码:

代码语言:javascript
复制
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()表示为盲用户。但在这两种方法中,在“返回”之后发生了什么?这两种情况下都有元组。但是元组有什么会员呢?我以前从没见过这样的事。

EN

回答 3

Stack Overflow用户

发布于 2019-10-23 21:09:30

示例中的__repr____str__都返回格式化字符串,而不是元组。当对象上显式或隐式地调用repr()str()时,将调用这些函数。

例如,print(Point(1,2))会打印__str__的结果,因为它在对象内部调用str(),而print([Point(1,2)])则会打印__repr__的结果。

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

票数 2
EN

Stack Overflow用户

发布于 2019-10-23 21:22:35

以下是具体格式语法的详细说明。使用str.format方法,您可以在表单{...}的给定字符串实例中填充占位符。这些使用位置参数的工作方式如下:

代码语言:javascript
复制
>>> '{}:{}'.format(1, 2)
'1:2'
>>> '{0}:{1}'.format(1, 2)
'1:2'
>>> '{1}:{0}'.format(1, 2)
'2:1'

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

代码语言:javascript
复制
>>> '{0}:{1}:{0}'.format(1, 2)
'1:2:1'

使用.x符号,让我们访问该参数的属性。例如:

代码语言:javascript
复制
>>> class Test:
...     x = 1
...     y = 2
... 
>>> '{0.x}:{0.y}'.format(Test)
'1:2'

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

代码语言:javascript
复制
>>> 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__'

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

代码语言:javascript
复制
'Point({0.x!r}, {0.y!r})'.format(self)

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

同样的推理也适用于__str__方法。

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

代码语言:javascript
复制
>>> '{first}:{second}'.format(first=1, second=2)
'1:2'
>>> '{second}:{first}'.format(first=1, second=2)
'2:1'
票数 1
EN

Stack Overflow用户

发布于 2019-10-23 21:06:49

您可能需要在解释器中尝试这样做,以了解发生了什么:

代码语言:javascript
复制
>>> class Point:
    def __init__(self, x, y):
        """Initialize self."""
        self.x, self.y = x, y
    def __repr__(self):
        """Return repr(self)."""
        return f'{type(self).__name__}({self.x!r}, {self.y!r})'
    def __str__(self):
        """Return str(self)."""
        return f'({self.x!s}, {self.y!s})'

>>> Point(1, 2) # causes implicit call to __repr__
Point(1, 2)
>>> print(_) # causes implicit call to __str__
(1, 2)
>>> 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58530935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档