Вы можете вызвать метакласс ModelSchema
напрямую, вместо того, чтобы декларативно определять класс с помощью оператора class
.
m = marshmallow.ModelSchema
class_attributes = {
"sensor": Nested(Sensor),
"serial_interface": Nested(SerialInterface)
}
m = marshmallow.ModelSchema
mc = type(m)
MSchema = mc('MSchema', (m,), {
'Meta': type('Meta', (), {'model': cls}),
**class_attributes
})
Если вы не знаете, class
оператор - это просто декларативный синтаксис для вызова type
(или некоторого другого метакласса) с 3 аргументами: именем класса, кортежем родительских классов и dict
атрибутов класса. Оператор class
вычисляет свое тело для создания dict, затем вызывает type
(или другой заданный метакласс) и связывает возвращаемое значение с именем. Несколько простых примеров:
# Foo = type('Foo', (), {})
class Foo:
pass
# Foo = Bar('Foo', (), {})
class Foo(metaclass=Bar):
pass
# Foo = Bar('Foo', (Parent,), {'x': 3})
class Foo(Parent, metaclass=Bar):
x = 3
# def foo_init(self, x):
# self.x = x
# Foo = Bar('Foo', (), {'__init__': foo_init})
class Foo(metaclass=Bar):
def __init__(self, x):
self.x = x