【发布时间】:2016-11-19 04:46:10
【问题描述】:
出于好奇,我很感兴趣是否可以编写一个元类,使父类的方法优先于子类的方法。我想玩一会儿。不可能再覆盖方法了。基类必须显式调用子方法,例如使用对基实例的引用。
class Base(metaclass=InvertedInheritance):
def apply(self, param):
print('Validate parameter')
result = self.subclass.apply(param)
print('Validate result')
return result
class Child(Base):
def apply(self, param):
print('Compute')
result = 42 * param
return result
child = Child()
child.apply(2)
输出:
验证参数
计算
验证结果
【问题讨论】:
-
您已标记此 Python 3,但您使用的是 Python 2 元类语法,Python 3 完全忽略了该语法。如果你想在 Python 3 上指定一个元类,你应该做
class Foo(metaclass=Whatever)。 -
@user2357112 谢谢,已更正。
-
self.subclass意味着什么?如果Child.apply旨在返回Base.apply,而child.subclass是Child,那么self.subclass.apply将与Child.apply相同并且仍将返回Base.apply。属性访问机制不会“知道”您是尝试从外部代码还是从继承反转机制内部获取属性。您希望这种反向查找在直接访问类上的属性时起作用,还是仅在通过实例访问它们时起作用? -
@BrenBarn 是的,我明白了。这是一种访问子方法的方式。它可以是一个辅助对象,包含对子方法的引用。
-
这听起来像亚麻github.com/google/flax - 我搜索的东西完全一样,就因为亚麻。
标签: python python-3.x inheritance metaprogramming metaclass