如何在Python中初始化类(而非实例)?

14 投票
2 回答
7869 浏览
提问于 2025-04-16 18:39

我想在一个类加载的时候,只合并当前类和继承类的约束,而不是每次创建对象的时候都合并。

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 个回答

17

使用元类。

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
2

我最后用上了一个类装饰器,而且没有使用继承。这个装饰器的作用是把当前类和继承类的限制条件合并在一起,并且重写了 __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

这一步是我解决问题的关键,因为这个装饰器需要对类进行修改(合并限制条件和插入方法),同时也要对实例进行调整。

撰写回答