首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Auto __repr__方法

Auto __repr__方法
EN

Stack Overflow用户
提问于 2009-04-15 17:21:58
回答 7查看 8.8K关注 0票数 26

我想要任何类的简单表示,比如{ property = value },有自动__repr__

EN

回答 7

Stack Overflow用户

发布于 2016-07-23 18:43:10

最简单的方法:

代码语言:javascript
复制
def __repr__(self):
    return str(self.__dict__)
票数 30
EN

Stack Overflow用户

发布于 2009-04-15 09:36:03

是的,您可以将一个类设置为"AutoRepr“,并让所有其他类扩展它:

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

请注意,上面的代码不能很好地处理(直接或间接)引用自身的数据结构。作为另一种选择,您可以定义适用于任何类型的函数:

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

请注意,出于前面提到的原因,上面的函数并不是故意以递归方式定义的。

票数 13
EN

Stack Overflow用户

发布于 2015-01-06 20:47:38

好吧,我尝试了一下其他答案,得到了一个非常好的解决方案:

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

您可以将其用作装饰器:

代码语言:javascript
复制
@data
class PythonBean:
    def __init__(self):
        self.int = 1
        self.list = [5, 6, 7]
        self.str = "hello"
        self.obj = SomeOtherClass()

开箱即用的智能__repr__

代码语言:javascript
复制
PythonBean(int = 1, obj: <SomeOtherClass>, list = [5, 6, 7], str = 'hello')

这适用于任何递归类,包括树结构。如果您尝试在类self.ref = self中放置一个自引用,该函数将尝试(成功地)在大约一秒钟内完成。

当然,永远记住你的老板-我的老板不会喜欢这样的语法糖)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/750908

复制
相关文章

相似问题

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