如何在Python中合并不同父类定义的property属性?
合并多继承中不同父类的property属性输出
假设有两个类Foo和Bar,各自通过不同逻辑计算property属性stuff。现在需要在子类的属性中合并这两个父类的stuff输出,预期效果如下(代码中get_stuff_from需要替换为合法Python语法):
class Foo(): @property def stuff(self): return ['a','b','c'] class Bar(): @property def stuff(self): return ['1','2','3'] class FooBar(Foo, Bar): @property def stuff(self): # 计算Foo类逻辑下的stuff值 foo_stuff = get_stuff_from(Foo) # 计算Bar类逻辑下的stuff值 bar_stuff = get_stuff_from(Bar) # 返回合并后的结果 return foo_stuff + bar_stuff foo_bar = FooBar() print(foo_bar.stuff)
预期运行后输出:
['a', 'b', 'c', '1', '2', '3']
如果stuff是普通方法而非property,实现起来会很简单,示例如下:
class Foo(): def stuff(self): return ['a','b','c'] class Bar(): def stuff(self): return ['1','2','3'] class FooBar(Foo, Bar): def stuff(self): # 调用Foo类的stuff方法 foo_stuff = Foo.stuff(self) # 调用Bar类的stuff方法 bar_stuff = Bar.stuff(self) # 返回合并后的结果 return foo_stuff + bar_stuff foo_bar = FooBar() print(foo_bar.stuff())
解决方案
当然可以用property实现相同效果,核心是直接调用父类property对应的 getter 方法,或者通过描述符协议的__get__方法获取值,具体实现如下:
方法一:调用fget属性
class Foo(): @property def stuff(self): return ['a','b','c'] class Bar(): @property def stuff(self): return ['1','2','3'] class FooBar(Foo, Bar): @property def stuff(self): # 调用Foo类中stuff属性的getter方法 foo_stuff = Foo.stuff.fget(self) # 调用Bar类中stuff属性的getter方法 bar_stuff = Bar.stuff.fget(self) return foo_stuff + bar_stuff foo_bar = FooBar() print(foo_bar.stuff)
方法二:调用描述符的__get__方法
class FooBar(Foo, Bar): @property def stuff(self): foo_stuff = Foo.stuff.__get__(self) bar_stuff = Bar.stuff.__get__(self) return foo_stuff + bar_stuff
这两种方式都能正确获取对应父类property的计算结果:@property装饰器会把原方法包装成property对象,其中fget属性指向原来的 getter 方法;而__get__是描述符协议中定义的方法,专门用于获取属性值。
内容的提问来源于stack exchange,提问作者LuizFelippe
相关产品推荐
相关产品推荐

