使用python文字以Python形式创建对象的字符串表示形式

时间:2017-06-22 07:07:04

标签: 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类型的正确字符串表示形式?也许是标准的库函数?

1 个答案:

答案 0 :(得分:3)

实现此目的的一种简单方法是通过__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)
>>>