2014-11-24 32 views
0

我需要在運行時動態設置類屬性。這怎麼能實現?我沒有辦法找到在實例init之外設置類屬性,這意味着每次創建實例時都會運行它。這隻需要發生一次(當類定義被加載時)。Python:如何動態定義類屬性的值?

修訂示例。

理想情況下,我需要做這樣的事情,但似乎這是不可能的:

# Note modules are python modules which extend the functionality of my reusable app. 
class Test(): 
    active_modules = Test.get_active_moduels() 

    @classmethod 
    def get_active_moduels(cls): 
     #logic for collecting installed modules 
     return installed 

我能得到這份工作是這樣完成的,但它似乎愚蠢的,並導致重大問題。如果我在嘗試訪問active_modules之前,Test類被實例化,我得到[]即使有active_modules。

# Note modules are python modules which extend the functionality of my reusable app. 
class Test(): 
    active_modules = [] 

    def __init__ (self): 
     Test.get_active_moduels() 

    @classmethod 
    def get_active_moduels(cls): 
     if not cls.active_modules: 
      #logic for collecting installed modules 
      ..... 
      cls.active_modules = installed_modules 
     else: 
      return cls.active_modules 

我能得到這個通過創建active_modules另一個註冊表做,但我認爲有一種方法在類中實現這一點......

+0

我沒有在這裏看到任何子類... – wim 2014-11-25 00:01:50

+0

無論如何,子類已經可以從'Test .__ subclasses __()',也許這可以幫助你 – wim 2014-11-25 00:03:49

+0

不幸的是,問題是更復雜,然後我的例子帶領。我試圖創建一個'active_subs = Test.get_installed_subs()'的簡單需求,這就是我所追求的。 – arctelix 2014-11-25 00:09:38

回答

0

這將是更容易幫助,如果你使用具體的術語。什麼是「分」?在任何情況下,你的代碼可以簡化爲:

t1 = Test() 
#active will have the installed subs. 
active = t1.active_subs 

不要你的代碼getter和setter不必要的過度複雜化:

def compute_defaults(): 
    they = [] 
    they.append('default_1') 
    they.append('default_2') 
    return they 

class Test(): 
    active_subs = compute_defaults() 

    def __init__(self, sub=None): 
     if sub: 
      self.active_subs.append(sub) 

然後如你所願,你可以使用你的代碼。

+0

['default_1','default_2']在運行時動態確定,因此這是不可能的。因此,這個問題。如何動態定義類屬性的值? – arctelix 2014-11-25 02:50:40

+0

getter和setter在那裏確保在創建Test類的第一個實例之前訪問類屬性。除非創建了一個實例,否則't1.active_subs'會產生[]。 – arctelix 2014-11-25 04:04:49

+0

您可以用可執行代碼替換文字列表。我已經更新了答案。如果該代碼無法處理您的情況,那麼您需要更多地解釋您的情況。 – 2014-11-25 09:59:53