以下代码
def _say(x): return x
class newObject(object):
def __init__(self, **kw):
for x in kw:
self.x = kw[x]
for i in self.x:
a = self.x[i]
eval('self.x.{u}={t}'.format(u=i, t=a)) #on another note, why would setattr(self.x, i, a) not work
self.object_ret()
def object_ret(self):
return self
data = newObject(**{
'ranks':{
'one':['yhggti','aragos','raithinki'],
'two':['grythin','radios'],
'three':['riyoken','schrodinger']},
'nicknames':{
'riyoken':['theos','arahiron'],
'illogic':['harab','thing']},
'commands':{
'say':_say},
})
概述了我想如何在另一个属性的末尾向对象添加更多属性。我以前喜欢
class newObject(object):
def __init__(self, **kw):
[setattr(self, x, kw[x]) for x in kw]
self.object_ret()
data.nicknames将返回
>>> data.nicknames
{'illogic': ['harab', 'thing'], 'riyoken': ['theos', 'arahiron']}
现在我希望能够调用data.nicknames.riyoken并返回['theos', 'arahiron']
,这不适用于原始设置,因此代码的顶部。然而,eval('self.x.{u}={t}'.format(u=i, t=a))
部分错误并提供诸如此类的内容
File "<string>", line 1
self.x.say=<function _say at 0x030E9420>
^
SyntaxError: invalid syntax
如果有任何可能的方法让我可以调用data.nicknames.riyoken或data.commands.say,我将不胜感激。
答案 0 :(得分:1)
你混淆了几件事。这是一个与您的代码接近的工作版本:
class Attributes:
pass
class NewObject(object):
def __init__(self, **kw):
for x in kw:
attrs = Attributes()
setattr(self, x, attrs)
for i in kw[x]:
a = kw[x][i]
setattr(attrs, i, a)
以下是我将如何做到这一点:
class NewObject(object):
def __init__(self, **kwargs):
for key, value in kwargs.items():
if isinstance(value, dict):
value = NewObject(**value)
setattr(self, key, value)
这将处理任意嵌套的dicts。
答案 1 :(得分:0)
为什么在初始化时不将数据作为参数传递给类?所以让类把字典作为参数。不知道我在这里遗失了什么。