Атрибуты класса с «вычисляемым» именем - PullRequest
3 голосов
/ 26 мая 2009

При определении атрибутов класса через «вычисляемые» имена, например:

class C(object):
    for name in (....):
        exec("%s = ..." % (name,...))

Есть ли другой способ обработки многочисленных определений атрибутов, чем при использовании exec? getattr (C, name) не работает, потому что C не определен во время создания класса ...

Ответы [ 4 ]

11 голосов
/ 27 мая 2009

Как насчет:

class C(object):
    blah blah

for name in (...):
    setattr(C, name, "....")

То есть выполните настройку атрибута после определения.

3 голосов
/ 27 мая 2009
class C (object):
    pass

c = C()
c.__dict__['foo'] = 42
c.foo # returns 42
2 голосов
/ 27 мая 2009

Если весь ваш класс «рассчитан», то могу я предложить type вызываемый. Это особенно полезно, если ваш оригинальный контейнер был диктом:

d = dict(('member-%d' % k, k*100) for k in range(10))
C = type('C', (), d)

Это даст вам те же результаты, что и

class C(object):
    member-0 = 0
    member-1 = 100
    ...

Если ваши потребности действительно сложны, рассмотрите метаклассы. (На самом деле type - это метакласс =)

0 голосов
/ 27 мая 2009

Как насчет использования метаклассов для этой цели?

Извлечение Вопрос 100003: Что такое метакласс в Python? .

...