我有一个类层次结构,其中某些方法可以使用在类级别定义的属性列表。
假设对于类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,[])]
setattr(cls,value)
return cls
@InheritClassVariable('X',Base)
class A(Base):
X = ['propA1','propA2']
@InheritClassVariable('X',Base)
class B(Base):
X = ['propB']
@InheritClassVariable('X',Base)
class C(A):
X = ['propC']
@InheritClassVariable('X',Base)
class D(C,B,A):
X = ['propD']
if __name__ == "__main__":
print(f"D.X = {D.X}")