You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

继承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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 09:35:07