向python添加嵌套属性
下面的代码向python添加嵌套属性,python,object,attributes,Python,Object,Attributes,下面的代码 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)) #o
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.昵称将返回的位置
>data.昵称
{'illogic':['harab','thing','riyoken':['theos','arahiron']}
现在,我希望能够调用data.nickname.riyoken并返回['theos','arahiron']
,这与原始设置不兼容,因此是代码的顶部。然而,eval('self.x.{u}={t}'。格式(u=i,t=a))
部分出现错误,并给出如下信息
文件“”,第1行
自我介绍=
^
语法错误:无效语法
如果有任何方法可以让它工作,我可以调用data.昵称.riyoken或data.commands.say,那将不胜感激。为什么不在初始化时将数据作为参数传递给类?因此,让全班学生以词典作为论据。我不确定我是否遗漏了什么。你把一些事情搞错了。下面是一个与您的代码相近的工作版本:
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)
这将处理任意嵌套的dict。
setattr(self.x,i,a)
应该可以正常工作。在init setattr(self.x,i,a)AttributeError中,我现在看到:“dict”对象没有属性“two”。事实上,您不能在dict(和许多其他内置类型)上设置属性。这应该是一个注释。我知道。。。我没有足够的声誉>:(好吧,删除这个,因为它现在更糟了。好吧,至少你是善良的、友好的、鼓励贡献的。我很抱歉,我不是故意这么刻薄的。我投了反对票,因为它本应该是一个评论,我不能收回它,所以我建议你删除这个,这样你就可以恢复你的2的声誉。现在有人已经投票反对我onger适用。