В моем проекте Django я хочу, чтобы все мои поля модели имели дополнительный аргумент, называемый documentation
. (Это было бы похоже на verbose_name
или help_text
, но вместо внутренней документации.)Переопределить __init__ для всех классов в модуле
Это кажется простым: просто подкласс и переопределить это месторождение __init__
:
def __init__(self, verbose_name=None, name=None, documentation=None, **kwargs):
self.documentation = documentation
super(..., self).__init__(verbose_name, name, **kwargs)
Вопрос в том, как я делаю это относится к все из 20 полевых классов в django.db.models (BooleanField
, CharField
, PositiveIntegerField
и т. Д.)?
Единственный способ я вижу использовать метапрограммирование с инспектировать модуля:
import inspect
import sys
from django.db.models import *
current_module = sys.modules[__name__]
all_field_classes = [Cls for (_, Cls) in inspect.getmembers(current_module,
lambda m: inspect.isclass(m) and issubclass(m, Field))]
for Cls in all_field_classes:
Cls.__init__ = <???>
Я не привык видеть код, как это, и даже не знаю, если он будет работать. Хотел бы я просто добавить атрибут в базовый класс Field и наследовать его для всех дочерних классов, но я не вижу, как это можно сделать.
Любые идеи?
насчет перезаписи класса 'Field'? –
@Raydel - он не будет работать, если все его подклассы тщательно обработаны, чтобы не заботиться о аргументах, которые не относятся к подклассу, и вызывают '__init__' суперкласса с неизвестным, дополнительным аргументом. Вы можете создать систему, чтобы вести себя так, но вы не можете полагаться на работу других, чтобы сделать это. (Хотя можно посмотреть код soruce и посмотреть, что произойдет) – jsbueno
@RaydelMiranda: Вы имеете в виду подкласс «Поле» в моем коде? Я не думаю, что это повлияло бы на поведение подклассов «Поле». Это будет просто создание другого подкласса. – RexE