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

Mar*_*ari 17 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
Run Code Online (Sandbox Code Playgroud)

导致:

bar = Foo("baz", "ping")
print(str(bar)) # desired: Foo(attribute_1=baz, attribute_2=ping)
Run Code Online (Sandbox Code Playgroud)

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

fal*_*tru 30

您可以使用迭代实例属性vars,dir...:

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
Run Code Online (Sandbox Code Playgroud)

应用:

>>> str(Foo('bar', 'ping'))
'Foo(attribute_2=ping, attribute_1=bar)'
Run Code Online (Sandbox Code Playgroud)


sir*_*ain 5

您可以使用@dataclass,它会自动生成__init__()__repr__()__str__()等。您只需要向@dataclass类添加装饰器并向成员添加类型注释即可。您甚至可以删除您的__init__()实现。

from dataclasses import dataclass

@dataclass
class Foo(object):
    attribute_1 : str
    attribute_2 : str

bar = Foo("baz", "ping")
print(str(bar)) # Prints: Foo(attribute_1='baz', attribute_2='ping')
Run Code Online (Sandbox Code Playgroud)