使用多重继承构建python对象



我想动态地构建一个对象,允许使用基于多重继承的任何方式混合类属性。这是预期的行为。这些类是数据类,所以其中不会有很多方法,主要是数据属性。

class Foo():
def bar(self, x):
return x
class FooA(Foo):
def bar(self, x):
p = super().bar(x)
p += __class__.__name__
return p
class FooB(Foo):
def bar(self, x):
p = super().bar(x)
p += __class__.__name__
return p
class FooC(FooA, FooB):
def bar(self, x):
p = super().bar(x)
p += __class__.__name__
return p
f = FooC()
f.bar('S') # SFooBFooAFooC

然而,这段代码在光天化日之下违反了DRY原则,因此,如果当前类中没有特殊操作,我希望完全避免bar方法。

理想情况下,我想要像这样的东西

@bar_wrapper
class FooA(Foo):
pass
# OR
class FooA(Foo):
__metaclass__ = BarBase

而不是完全实现

class FooA(Foo):
def bar(self, x):
p = super().bar(x)
p += __class__.__name__
return p

本质上,有没有一种方法可以通过decorator或元类(我能想到的两个选项(提取多级继承类中的中间层类信息?有人知道怎么做吗?

编写一个类装饰器,将bar方法添加到类中:

def bar_wrapper(cls):
def bar(self, x):
p = super(cls, self).bar(x)
p += cls.__name__
return p
bar.__module__ = cls.__module__
bar.__qualname__ = '{}.{}'.format(cls.__qualname__, bar.__name__)
cls.bar = bar
return cls
class Foo():
def bar(self, x):
return x
@bar_wrapper
class FooA(Foo):
pass
@bar_wrapper
class FooB(Foo):
pass
@bar_wrapper
class FooC(FooA, FooB):
pass
f = FooC()
print(f.bar('S')) # SFooBFooAFooC

最新更新