2016-06-13 72 views
1

以下代碼附加嵌套屬性到Python

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

'setattr(self.x,i,a)'應該可以正常工作。當你嘗試時發生了什麼? –

+0

17,in __init__ setattr(self.x,i,a) AttributeError:'dict'object has no attribute'two' – user3723955

+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) 

這將處理任意嵌套類型的字典。

0

爲什麼不在初始化時將數據作爲參數傳遞給類?所以班上有字典作爲參數。不知道我是否在這裏失去了一些東西。

+0

這應該是一條評論。 –

+0

我知道...我沒有足夠的聲望> :( –

+0

那麼刪除它,因爲它現在更糟 –