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

2024-04-24 14:10:16 发布

您现在位置: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的用户必须显式地调用initialize方法,或者必须使用额外的类装饰器。

你知道如何初始化这个类吗?


Tags: 对象方法instance定义domaindefnotmerge
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

最后我得到了一个没有继承权的类装饰器。此修饰符合并当前类和继承类的约束,并重写__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

这是我的解决方案的关键,因为decorator必须修改类(合并约束和插入方法)和实例。

相关问题 更多 >