Вопрос

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

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

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

Это было полезно?

Решение

Как насчет:

class C(object):
    blah blah

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

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

Другие советы

class C (object):
    pass

c = C()
c.__dict__['foo'] = 42
c.foo # returns 42

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

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 является метакласс =)

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

Проверьте Вопрос 100003 :Что такое метакласс в Python?.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top