Подтвердить что ты не робот

Как инициализировать классы (а не экземпляры) в 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 должен явно вызвать метод инициализации или использовать дополнительный декоратор класса.

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

4b9b3361

Ответ 1

Я закончил с декоратором класса и без наследования. Этот декоратор объединяет ограничения текущего и унаследованного классов и переопределяет метод __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

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

Ответ 2

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

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