2014-10-02 41 views
2

看哪,我的簡單的類:我怎麼能動態地引用變量在Python

import sys 

class Foo(object): 

    def __init__(self): 
    self.frontend_attrs = ['name','ip_address','mode','port','max_conn'] 
    self.backend_attrs = ['name','balance_method','balance_mode'] 

init方法上面創建了兩個名單,我想動態是指他們兩個:

def sanity_check_data(self): 
    self.check_section('frontend') 
    self.check_section('backend') 

def check_section(self, section): 
    # HERE IS THE DYNAMIC REFERENCE 
    for attr in ("self.%s_attrs" % section): 
    print attr 

但當我這樣做時,python會抱怨("self.%s_attrs" % section)的調用。

我讀過有關使用get_attr動態發現模塊人...

getattr(sys.modules[__name__], "%s_attrs" % section)() 

可這對詞典進行。

+1

你想'GETATTR(自我,「{} _attrs」 .format(section))' – dano 2014-10-02 15:51:22

+1

真的,你不應該把數據保存在變量名中。這只是要求麻煩。你應該將這兩本字典保存在另一個結構中,甚至可以是另一本字典。 – TheSoundDefense 2014-10-02 15:52:23

+0

謝謝@TheSoundDefense的建議,我會把它帶上船! – stephenmurdoch 2014-10-02 15:59:05

回答

4

你在找什麼我認爲是getattr()。事情是這樣的:

def check_section(self, section): 
    for attr in getattr(self, '%s_attrs' % section): 
     print attr 

雖然與該特定情況下,你可能會用的字典更好,只是爲了讓事情變得簡單:

class Foo(object): 

    def __init__(self): 
    self.my_attrs = { 
     'frontend': ['name','ip_address','mode','port','max_conn'], 
     'backend': ['name','balance_method','balance_mode'], 
    } 

    def sanity_check_data(self): 
    self.check_section('frontend') 
    self.check_section('backend') 

    def check_section(self, section): 
    # maybe use self.my_attrs.get(section) and add some error handling? 
    my_attrs = self.my_attrs[section] 
    for attr in my_attrs: 
     print attr 
+0

嗚!它完美的作品。非常感謝! – stephenmurdoch 2014-10-02 15:58:25

+0

很高興幫助!如果您點擊櫃檯旁邊的支票圖標,那麼它會將該問題標記爲解決該特定答案。 – 2014-10-02 16:02:10

+0

特別感謝在結束位! – stephenmurdoch 2014-10-02 16:02:24