Не думаю, что вам нужен метакласс.
Определите базовую схему с помощью метода после загрузки, которому просто нужен класс.
class CustomSchema(Schema):
@post_load
def make_obj(self, data):
return self.OBJ_CLS(**data)
Если класс известен ввремя импорта (не ваш вариант использования), это позволяет вам факторизовать создание экземпляров, просто предоставив класс.Хорошо уже.
class PetSchema(CustomSchema):
OBJ_CLS = Pet
Если класс не известен во время импорта, то он может быть предоставлен позже.
class PetSchema(CustomSchema):
pass
PetSchema.OBJ_CLS = Pet
Если вам требуется дополнительная обработка перед созданием экземпляра, тогда вы можетепереопределите make_obj
в любом классе, как показано в вашем ответе.
class PetSchema(CustomSchema):
def make_obj(self, data):
data = my_func(data)
return Pet(**data)
В более общем смысле, этот механизм позволяет определять хуки в базовой схеме.Это хороший способ преодолеть текущее ограничение в зефире: тот факт, что несколько методов post_load
могут быть выполнены в любом порядке.Определите один метод post_load
в базовом классе с крючком для каждого шага обработки.(Этот надуманный пример на самом деле не иллюстрирует суть.)
class CustomSchema(Schema):
@post_load
def post_load_steps(self, data):
data = self.post_load_step_1(data)
data = self.post_load_step_2(data)
data = self.post_load_step_3(data)
return data
def post_load_step_1(self, data):
return data
def post_load_step_2(self, data):
return data
def post_load_step_3(self, data):
return data