我有一个类层次结构,其中一些方法使用在类级别定义的属性列表。
假设对于A我拥有A.X = [propA1, propA2]的类和C我需要的子类C.X = [propA1, propA2, propC]。子类从父类继承属性,因此编写类方法是有意义的super()调用的,每个都使用自己类的属性。
然而,这有点麻烦。我可以在基类中的单个方法中处理所有属性。因此,为每个子类定义一个包含一组新属性的类变量并手动向下执行确实感觉更自然cls.__mro__检索所有属性。
我想出的(下面)似乎相对透明地工作,但它是惯用的吗?是否有更典型的编码模式?有没有办法避免装饰所有子类?
class Base(object):
pass
class InheritClassVariable:
def __init__(self, var, base):
self.var = var
self.base = base
def __call__(self, cls):
name = self.var
uname = '_' + name
bases = [B for B in cls.__mro__ if issubclass(B, self.base)]
setattr(cls, uname, getattr(cls, name, []))
value = [item for B in bases for item in getattr(B, uname, [])]
setattr(cls, name, value) …Run Code Online (Sandbox Code Playgroud)