Pythonically使用python文本创建对象的字符串表示

2024-09-29 22:18:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个对象,它的构造函数接受*kwargs,并将它们设置为属性。你知道吗

class Observable(object):
    def __init__(self, **kwargs):
        for key in kwargs.keys():
            setattr(self, key, kwargs[key])

我希望print用以下方式表示对象:

>>> obs = Observable(foo=1, bar=5, _bazz=12, name='Amok', props=('One', 'two'))
>>> print(x)
Observable(bar=5, foo=1, name='Amok', props=('One', 'two'))

我试图添加一个自定义__repr__

class Observable(object):
    def __init__(self, **kwargs):
        for key in kwargs.keys():
            setattr(self, key, kwargs[key])

    def __repr__(self):
        atribs = [(atrib,  self.__dict__[atrib]) for atrib in self.__dict__.keys() if not '_' == atrib[0]]
        atrib_strs = []
        for atrib, val in atribs:
            atrib_strs.append('{}={}'.format(atrib, val))

        out_str = '{}({})'.format(self.__class__.__name__, ', '.join(atrib_strs))
        return out_str

对于上面的输入,它打印:

Observable(foo=1, bar=5, name=Amok, props=('One', 'two'))

我担心的是我有Amok而不是'Amok'。 我可以为字符串添加类型检查,但也许有一种方法可以获得任何python类型的正确字符串表示形式?也许是一个标准的库函数?你知道吗


Tags: keynameinselfforfoodefbar
1条回答
网友
1楼 · 发布于 2024-09-29 22:18:39

实现这一点的简单方法是通过repr()调用每个属性的值__repr__()。这样,每个字符串表示都是 保证显示。你知道吗

>>> class Observable(object):
    def __init__(self, **kwargs):
        for key in kwargs.keys():
            setattr(self, key, kwargs[key])

    def __repr__(self):
        atribs = [(atrib,  self.__dict__[atrib]) for atrib in self.__dict__.keys() if not '_' == atrib[0]]
        atrib_strs = []
        for atrib, val in atribs:
            atrib_strs.append('{}={}'.format(atrib, repr(val))) # add repr() call

        out_str = '{}({})'.format(self.__class__.__name__, ', '.join(atrib_strs))
        return out_str

>>> ob = Observable(foo=1, bar=5, _bazz=12, name='Amok', props=('One', 'two'))
>>> print(ob)
Observable(foo=1, name='Amok', props=('One', 'two'), bar=5)
>>> 

相关问题 更多 >

    热门问题