Судя по вашему примеру кода, вы хотите сделать это одновременно с созданием класса.В этом случае, если вы используете CPython, вы можете использовать locals()
.
class Foo(object):
locals().update(a=1, b=2, c=3)
. Это работает, потому что во время определения класса locals()
относится к пространству имен класса.Это поведение, зависящее от реализации, и оно может не работать в более поздних версиях Python или альтернативных реализациях.
Менее грязная версия, использующая фабрику классов, показана ниже.Основная идея заключается в том, что ваш словарь преобразуется в класс с помощью конструктора type()
, и затем он используется в качестве базового класса для вашего нового класса.Для удобства определения атрибутов с минимальным синтаксисом я использовал соглашение **
для принятия атрибутов.
def dicty(*bases, **attrs):
if not bases:
bases = (object,)
return type("<from dict>", bases, attrs)
class Foo(dicty(a=1, b=2, c=3)):
pass
# if you already have the dict, use unpacking
dct = dict(a=1, b=2, c=3)
class Foo(dicty(**dct)):
pass
Это действительно просто синтаксический сахар для вызова type()
самостоятельно.Это прекрасно работает, например:
class Foo(type("<none>", (object,), dict(a=1, b=2, c=3))):
pass