我想要任何类的简单表示,比如{ property = value },有自动__repr__吗
发布于 2016-07-23 18:43:10
最简单的方法:
def __repr__(self):
return str(self.__dict__)发布于 2009-04-15 09:36:03
是的,您可以将一个类设置为"AutoRepr“,并让所有其他类扩展它:
>>> class AutoRepr(object):
... def __repr__(self):
... items = ("%s = %r" % (k, v) for k, v in self.__dict__.items())
... return "<%s: {%s}>" % (self.__class__.__name__, ', '.join(items))
...
>>> class AnyOtherClass(AutoRepr):
... def __init__(self):
... self.foo = 'foo'
... self.bar = 'bar'
...
>>> repr(AnyOtherClass())
"<AnyOtherClass: {foo = 'foo', bar = 'bar'}>"请注意,上面的代码不能很好地处理(直接或间接)引用自身的数据结构。作为另一种选择,您可以定义适用于任何类型的函数:
>>> def autoRepr(obj):
... try:
... items = ("%s = %r" % (k, v) for k, v in obj.__dict__.items())
... return "<%s: {%s}." % (obj.__class__.__name__, ', '.join(items))
... except AttributeError:
... return repr(obj)
...
>>> class AnyOtherClass(object):
... def __init__(self):
... self.foo = 'foo'
... self.bar = 'bar'
...
>>> autoRepr(AnyOtherClass())
"<AnyOtherClass: {foo = 'foo', bar = 'bar'}>"
>>> autoRepr(7)
'7'
>>> autoRepr(None)
'None'请注意,出于前面提到的原因,上面的函数并不是故意以递归方式定义的。
发布于 2015-01-06 20:47:38
好吧,我尝试了一下其他答案,得到了一个非常好的解决方案:
class data:
@staticmethod
def repr(obj):
items = []
for prop, value in obj.__dict__.items():
try:
item = "%s = %r" % (prop, value)
assert len(item) < 20
except:
item = "%s: <%s>" % (prop, value.__class__.__name__)
items.append(item)
return "%s(%s)" % (obj.__class__.__name__, ', '.join(items))
def __init__(self, cls):
cls.__repr__ = data.repr
self.cls = cls
def __call__(self, *args, **kwargs):
return self.cls(*args, **kwargs)您可以将其用作装饰器:
@data
class PythonBean:
def __init__(self):
self.int = 1
self.list = [5, 6, 7]
self.str = "hello"
self.obj = SomeOtherClass()开箱即用的智能__repr__:
PythonBean(int = 1, obj: <SomeOtherClass>, list = [5, 6, 7], str = 'hello')这适用于任何递归类,包括树结构。如果您尝试在类self.ref = self中放置一个自引用,该函数将尝试(成功地)在大约一秒钟内完成。
当然,永远记住你的老板-我的老板不会喜欢这样的语法糖)
https://stackoverflow.com/questions/750908
复制相似问题