继承Enum的类调用多态方法出现不符合预期的结果
问题原因及解决方案
问题原因
当Activations同时继承Activation和Enum时,Activations.RELU本质是一个Enum实例,而非Relu实例。Enum成员会把你赋值的对象(这里是Relu())存在自身的value属性中,直接调用Activations.RELU.activate()时,Python会优先调用Activations继承自Activation的方法,而非value属性里Relu对象的方法,所以输出了in activation。
解决方案
方案1:直接访问value属性调用方法
这是最直接的方式,明确获取Enum成员存储的实际对象后调用方法:
activ2 = Activations.RELU.value.activate(11) # 输出: in relu
方案2:重写__getattr__实现自动转发
如果想保留Activations.RELU.activate()的调用形式,可以在Activations类中重写__getattr__方法,将未找到的属性/方法转发给value对象:
from enum import Enum class Activation: def activate(self, value): print("in activation") pass def derivative(self, value): pass class Relu(Activation): def activate(self, value): print('in relu') return max(0, value) def derivative(self, value): return 0 if value<= 0 else 1 class Activations(Activation, Enum): RELU = Relu() def __getattr__(self, name): # 当访问的属性不在Enum实例中时,转发给value对象 return getattr(self.value, name) activ2 = Activations.RELU.activate(11) # 输出: in relu
这样调用Activations.RELU.activate()时,会自动触发Relu实例的对应方法,符合预期的多态行为。
内容的提问来源于stack exchange,提问作者mifmif
相关产品推荐
相关产品推荐

