Как инициализировать классы (а не экземпляры) в 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 2.7)
  • Исключение множественного наследования
  • Класс со слишком большим количеством параметров: лучшая стратегия дизайна?
  • Python - typechecking OK, когда ошибка не будет выбрана иначе?
  • Как вызвать исходный метод, когда он очищен от обезьяны?
  • Python - Преобразование CSV в объекты - Дизайн кода
  • Python unitest - использовать переменные, определенные в настройках модуля и класса, в тестах
  • Что такое частичный класс?
  • Объем имен, определенных в блоке классов, не распространяется на блоки методов. Почему это?
  • Наследование Python и вызов конструктора родительского класса
  • Является ли хорошей практикой делать вложенный класс в python?
  •  
    Interesting Posts for Van-Lav

    Флажок static_folder, размещенный на S3

    Django Не удается обновить запрос после того, как был сделан фрагмент

    wxpython не может захватить EVT_KEY_DOWN enent

    Как передать стильность в моем классе?

    Процесс Python продолжает расти в сценарии загрузки django db

    Электронная коммерция с нуля или нет

    Использование grep для чтения журнала для pattern1 в файле и печати только строк, содержащих pattern1. Прекратите поиск, когда pattern2 найден в файле

    Django-Configurations приводит к тому, что мой STATIC_URL недействителен

    Pypi: запрещено хранить или редактировать информацию об упаковке

    в чем разница между matplotlib.pyplot и matplotlib.figure?

    не удается создать проект django с помощью командной строки Windows

    Как отформатировать оператор утверждения python, который соответствует PEP8?

    Импортировать urllib или urllib 2 в Python 2.7 с помощью ImportError: невозможно импортировать имя iskeyword

    Каковы значения веса для использования в numpy polyfit и какова ошибка пригонки

    Декораторы и методы python

    Python - лучший язык программирования в мире.