python 使用多重继承构建对象

python object building using multi-inheritance

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

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方法,如果当前class没有特殊操作的话。

理想情况下我想要

@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

基本上有没有一种方法可以通过装饰器或元class(我可以使用的两个选项)在多级继承class中提取中间层class信息考虑到)?有人知道如何做到这一点吗?

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

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