Python __repr__ 对所有成员变量
Python __repr__ for all member variables
使用成员变量 x
和 y
为 class 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)
但是当有很多成员变量时,这会变得乏味。
我想你想要这样的东西:
def __repr__(self):
return "Foo({!r})".format(self.__dict__)
这将在字符串中添加 repr(self.__dict__)
,在格式说明符中使用 !r
告诉 format()
调用项目的 __repr__()
。
在此处查看 "Conversion field":https://docs.python.org/3/library/string.html#format-string-syntax
基于,您可以将上面的行替换为
return "{}({!r})".format(self.__class__.__name__, self.__dict__)
更通用的方法。
当我想要这样的东西时,我将它用作混合:
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()),
)
它给出 class 名称、(缩短的)id 和所有属性。
很好的例子!
漂亮的输出更好
放置简单 return "\n{!r}".format(self.__dict__)
并在 root 中完整打印 return "Class name: '{}' \n{!r}".format(self.__class__.__name__, self.__dict__)
使用成员变量 x
和 y
为 class 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)
但是当有很多成员变量时,这会变得乏味。
我想你想要这样的东西:
def __repr__(self):
return "Foo({!r})".format(self.__dict__)
这将在字符串中添加 repr(self.__dict__)
,在格式说明符中使用 !r
告诉 format()
调用项目的 __repr__()
。
在此处查看 "Conversion field":https://docs.python.org/3/library/string.html#format-string-syntax
基于
return "{}({!r})".format(self.__class__.__name__, self.__dict__)
更通用的方法。
当我想要这样的东西时,我将它用作混合:
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()),
)
它给出 class 名称、(缩短的)id 和所有属性。
很好的例子!
漂亮的输出更好
放置简单 return "\n{!r}".format(self.__dict__)
并在 root 中完整打印 return "Class name: '{}' \n{!r}".format(self.__class__.__name__, self.__dict__)