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