所有成员变量的Python __repr__

时间:2017-06-16 17:50:00

标签: python string-formatting repr

使用成员变量__repr__Foo为类x实施y,有没有办法自动填充字符串?不起作用的示例:

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)

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

3 个答案:

答案 0 :(得分:9)

当我想要这样的东西时,我用它作为mixin:

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和所有属性。

答案 1 :(得分:1)

我想你想要这样的东西:

    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__)

用于更通用的方法。

答案 2 :(得分:0)

很好的例子!

为了更好的输出 放置简单return "\n{!r}".format(self.__dict__) 并以root全文打印return "Class name: '{}' \n{!r}".format(self.__class__.__name__, self.__dict__)