Питонический подход к именам переменных динамического класса - PullRequest
1 голос
/ 26 октября 2009

следующий код:

class Log:

    BAT_STATS = ['AB', 'R', 'H', 'HR']

    def __init__(self, type):
        for cat in Log.BAT_STATS:
               self.cat = 0

Я хочу, чтобы цикл создавал свойство класса каждого ключа в BAT_STATS, поэтому я могу перейти:

log = Log()
print log.HR;

Аналогично PHP с $ this -> $$ foo = 'bar', где $ foo будет 'HR'.

Ответы [ 2 ]

8 голосов
/ 26 октября 2009

Может быть, это?

class Log:
    BAT_STATS = ['AB', 'R', 'H', 'HR']

    def __init__(self, type):
        for cat in Log.BAT_STATS:
            setattr(self, cat, 0)

РЕДАКТИРОВАТЬ - Ой, отступ был немного испорчен.

@ EOL: Вы предлагаете включить это прямо в определение класса? Хотя для некоторых приложений было бы неплохо просто установить эти значения один раз для класса, а не для каждого экземпляра, я не уверен, как бы вы это сделали. Внутри определения класса у вас нет переменной «self» или «klass» для вызова setattr. В конце определения класса Python разбирает словарь localals для использования в качестве словаря-члена класса. Вы можете прочитать этот словарь напрямую с помощью locals(), но я не думаю, что у вас есть какие-либо гарантии, что вы можете написать ему обратно. Я предполагаю, что самый простой способ получить эффект - это изменить словарь классов после того, как он был создан, но это может быть довольно запутанным, потому что тогда поведение класса уже не ясно только из его определения. Это не обязательно плохая идея, но я не хотел бы рекомендовать ее без лучшего понимания сценария, в котором она будет использоваться.

0 голосов
/ 26 октября 2009

Явная рекомендация : НЕ ИСПОЛЬЗУЙТЕ следующее.
и, пожалуйста, успокойся на понижение голосов ...

Редактировать: Я даже нашел цитату Алекса Мартелли, в которой говорится, насколько плоха идея моего фрагмента.
(Короткая выдержка из Python в двух словах , 2-е изд. O'Reilly 2006)
Используйте exec только тогда, когда это действительно необходимо. Чаще всего лучше избегать, чтобы exec выбирал более конкретные, хорошо контролируемые механизмы вместо этого: exec-файлы теряют контроль над пространством имен вашего кода, ухудшают производительность и подвергают вас исчислению чисел, трудно обнаруживаемым ошибкам.

Поэтому вот мой не такой питонический момент :

class Log:
   BAT_STATS = ['AB', 'R', 'H', 'HR']
   def __init__(self):
      for cat in Log.BAT_STATS:
           exec('self.' + cat + ' = 0')

Использование setattr (), конечно, чище (я рекомендую его в этом простом случае), но приятно помнить о силе исполнения ... Немного похоже на напоминание об опасном инструменте, который мы имеем в сарае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...