有没有办法在python中自动生成__str __()实现?

时间:2015-10-02 14:58:59

标签: python boilerplate

由于手动为我的类手动实现字符串表示,我想知道是否有一种pythonic方法可以自动执行此操作。

我希望有一个输出,涵盖类的所有属性和类名。这是一个例子:

class Foo(object):
    attribute_1 = None
    attribute_2 = None
    def __init__(self, value_1, value_2):
         self.attribute_1 = value_1
         self.attribute_2 = value_2

导致:

bar = Foo("baz", "ping")
print(str(bar)) # desired: Foo(attribute_1=baz, attribute_2=ping)

在一些Java项目中使用Project Lombok @ToString后,我想到了这个问题。

2 个答案:

答案 0 :(得分:25)

您可以使用varsdir,...:

来迭代实例属性
def auto_str(cls):
    def __str__(self):
        return '%s(%s)' % (
            type(self).__name__,
            ', '.join('%s=%s' % item for item in vars(self).items())
        )
    cls.__str__ = __str__
    return cls

@auto_str
class Foo(object):
    def __init__(self, value_1, value_2):
        self.attribute_1 = value_1
         self.attribute_2 = value_2

申请:

>>> str(Foo('bar', 'ping'))
'Foo(attribute_2=ping, attribute_1=bar)'

答案 1 :(得分:2)

写了这个,而falsetru回答。 同样的想法,我的阅读方面非常友好,他的实施得更好[imh]

class stringMe(object):
        def __str__(self):
            attributes = dir(self)
            res = self.__class__.__name__ + "("
            first = True
            for attr in attributes:
                if attr.startswith("__") and attr.endswith("__"):
                    continue

                if(first):
                    first = False
                else:
                    res += ", "

                res += attr + " = " + str( getattr(self, attr))

            res += ")"
            return res

    class Foo(stringMe):
        attribute_1 = None
        attribute_2 = None
        def __init__(self, value_1, value_2):
             self.attribute_1 = value_1
             self.attribute_2 = value_2


bar = Foo("baz", "ping")
print(str(bar)) # desired: Foo(attribute_1=baz, attribute_2=ping)