Python __repr__ 用于所有成员变量

Posted

技术标签:

【中文标题】Python __repr__ 用于所有成员变量【英文标题】:Python __repr__ for all member variables 【发布时间】:2017-11-19 14:00:20 【问题描述】:

用成员变量xy 为类Foo 实现__repr__,有没有办法自动填充字符串?不起作用的示例:

class Foo(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __repr__(self):
        return "Foo()".format(**self.__dict__)

>>> foo = Foo(42, 66)
>>> print(foo)
IndexError: tuple index out of range

还有一个:

from pprint import pprint
class Foo(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __repr__(self):
        return "Foo()".format(pprint(self.__dict__))

>>> foo = Foo(42, 66)
>>> print(foo)
'x': 42, 'y': 66
Foo(None)

是的,我可以将方法定义为

    def __repr__(self):
        return "Foo(x=, y=)".format(self.x, self.x)

但是当有很多成员变量时,这会变得乏味。

【问题讨论】:

【参考方案1】:

当我想要这样的东西时,我将它用作混合:

class SimpleRepr(object):
    """A mixin implementing a simple __repr__."""
    def __repr__(self):
        return "<klass @id:x attrs>".format(
            klass=self.__class__.__name__,
            id=id(self) & 0xFFFFFF,
            attrs=" ".join("=!r".format(k, v) for k, v in self.__dict__.items()),
            )

它给出了类名、(缩短的)id 和所有属性。

【讨论】:

不错的一个!真正的优雅。【参考方案2】:

我想你想要这样的东西:

    def __repr__(self):
        return "Foo(!r)".format(self.__dict__)

这将在字符串中添加repr(self.__dict__),在格式说明符中使用!r 告诉format() 调用项目的__repr__()

在此处查看“转化字段”:https://docs.python.org/3/library/string.html#format-string-syntax


基于Ned Batchelder's answer,您可以将上面的行替换为

return "(!r)".format(self.__class__.__name__, self.__dict__)

为了更通用的方法。

【讨论】:

如果self 引用自己,这样的实现将导致无限循环,因此您必须先过滤self.__dict__【参考方案3】:

很好的例子!

为了漂亮的输出更好 放置简单return "\n!r".format(self.__dict__) 并在根目录下完整打印return "Class name: '' \n!r".format(self.__class__.__name__, self.__dict__)

【讨论】:

以上是关于Python __repr__ 用于所有成员变量的主要内容,如果未能解决你的问题,请参考以下文章

python之反射和内置函数__str____repr__

Python __repr__ 和无

《Python》反射内置函数(__str____repr__)

python __str__ , __repr__区别

Python中__str__和__repr__的区别

第五天