2014-11-24 2 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, я получу [], хотя есть активные_модули.

# 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

+0

В любом случае подклассы уже доступны из 'Test .__ подкласса __()', возможно, это может помочь вам – wim

+0

, к сожалению, проблема более сложная, чем мой пример. Я попытался создать простое требование для 'active_subs = Test.get_installed_subs()' это то, что я получаю. – arctelix

ответ

0

Было бы гораздо легче помочь, если вы использовали конкретной терминологии. Что такое «под»? В любом случае, ваш код может быть упрощена:

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) 

Затем вы можете использовать свой код, как вы хотите:

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

Не более усложнять код с добытчиками и сеттеров без необходимости.

+0

['default_1', 'default_2'] динамически определяются во время выполнения, поэтому это невозможно. Отсюда вопрос. Как динамически определять значение атрибута класса? – arctelix

+0

Геттер и сеттер были там, чтобы гарантировать, что атрибуты класса были установлены, если к ним обратились до создания первого экземпляра класса Test. Другие мудрые 't1.active_subs' будут давать [], если только не был создан экземпляр. – arctelix

+0

Вы можете заменить буквенный список исполняемым кодом. Я обновил ответ. Если этот код не сможет справиться с вашей ситуацией, вам нужно больше рассказать о своей ситуации. –

Смежные вопросы