Как инициализировать классы (а не экземпляры) в Python?

Я хочу объединить ограничения из текущего и унаследованного классов только после загрузки класса (не на объект!).

class Domain(Validatable): constraints = {...} 

Для этого я определил метод _initialize_class_not_instance который должен вызываться один раз для каждого класса:

 class Validatable: @classmethod def _initialize_class_not_instance(cls): # merge constraints from derived class and base classes pass __class__._initialize_class_not_instance() # doesn't work # Validatable._merge_constraints() # doesn't work too 

Проблема в том, что __class__ не существует в этом контексте, и Validatable не определен. Но я хочу избегать того, что пользователь моего API должен явно вызвать метод инициализации или использовать дополнительный декоратор класса.

Любые идеи инициализации класса?

2 Solutions collect form web for “Как инициализировать классы (а не экземпляры) в Python?”

Используйте метакласс.

 class MetaClass(type): def __init__(cls, name, bases, d): type.__init__(cls, name, bases, d) cls.foo = 42 class MyClass(object): __metaclass__ = MetaClass print MyClass.foo 

Я закончил с декоратором класса и без наследования. Этот декоратор объединяет ограничения текущего и унаследованного классов и переопределяет метод __init__ :

 def validatable(cls): # merge constraints from derived class and base classes here ... original_init = cls.__init__ def init_to_insert(self, *args, **keywords): self.errors = {} original_init(self, *args, **keywords) cls.__init__ = init_to_insert return cls 

Это ключ для моего решения, поскольку декоратор должен изменить класс (слияния ограничений и методы вставки) и экземпляры.

  • В чем разница между старым стилем и новыми классами стилей в Python?
  • Автоматическая установка геттера, setter и deleter в python
  • Статический внутренний класс в python
  • Функция супер () Python
  • Является ли я .__ dict __. Update (** kwargs) хорошим или плохим стилем?
  • В Python, когда я должен использовать мета-класс?
  • Каковы преимущества использования метаклассов в реализациях, похожих на джанго?
  • Могу ли я предоставить метод класса Python в качестве параметра?
  • Python - лучший язык программирования в мире.