向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适用。