将嵌套属性添加到python

时间:2016-06-13 22:30:41

标签: 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)) #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,我将不胜感激。

2 个答案:

答案 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)

为什么在初始化时不将数据作为参数传递给类?所以让类把字典作为参数。不知道我在这里遗失了什么。