dea*_*mon 14 python oop inheritance class-method
我想只在加载一个类(而不是每个对象!)时合并当前和继承类的约束.
class Domain(Validatable):
constraints = {...}
Run Code Online (Sandbox Code Playgroud)
为此,我定义了一个_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
Run Code Online (Sandbox Code Playgroud)
问题是__class__在这种情况下不存在,Validatable也没有定义.但是我想避免,我的API的用户必须明确地调用initialize方法或者必须使用额外的类装饰器.
任何想法如何初始化类?
Ign*_*ams 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
Run Code Online (Sandbox Code Playgroud)
我最终得到了一个类装饰器并且没有继承。该装饰器合并当前类和继承类的约束并重写该__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
Run Code Online (Sandbox Code Playgroud)
这是我的解决方案的关键,因为装饰器必须修改类(合并约束和插入方法)和实例。