Атрибуты класса с “вычисляемым” именем
-
06-09-2019 - |
Вопрос
При определении атрибутов класса через "вычисляемые" имена, как в:
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?.
Не связан с StackOverflow