2014-11-24 31 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