我有一个对象,构造函数接受*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类型的正确字符串表示形式?也许是标准的库函数?
答案 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)
>>>