python - 向 python 添加嵌套属性

标签 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 的地方工作,我将不胜感激。

最佳答案

你混淆了一些事情。这是一个接近您的代码的工作版本:

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)

这将处理任意嵌套的字典。

关于python - 向 python 添加嵌套属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37800161/

相关文章:

python - 什么会导致 WordNetCorpusReader 没有属性 LazyCorpusLoader?

attributes - Jade : element attributes without value

c# - C# 动态程序集中的自引用枚举属性

Python Zip 列表到 Dataframe

Java : declaring objects in a loop

javascript - 如何在单击时循环遍历一组背景图像

javascript - Coderbyte 上的字母计数 I JavaScript 挑战

python - 为什么对 locals() 的调用会添加引用?

python - Django 和多个数据库

python - 带有返回语句的生成器