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
我想动态构建一个对象,它允许使用基于多重继承以他们喜欢的任何方式混合 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