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

Python中无需调用直接返回对象属性需重写哪个dunder方法?

答案

两个需求均可以实现,需要重写的魔法方法如下:

1. 实现直接输入实例返回对应数值

如果是需要在Python交互式环境(REPL)中输入实例名直接输出累积平均值,重写__repr__方法即可;如果需要print(实例)也输出对应数值,可以同时重写__str__方法。如果需要支持实例隐式转换为数值类型,可额外重写__float__、__int__方法。

2. 实现算术运算支持

要支持实例 + 数值的运算逻辑,重写__add__魔法方法即可;如果需要兼容数值 + 实例的反向运算场景,可以同时重写__radd__方法。


完整修改后的代码示例:

class CumulativeMovingAverage():
    cma = None
    n = 0
    def add(self, *args):
        if self.cma is None:
            self.cma = args[0]
        else:
            self.cma = (args[0] + self.n*self.cma) / (self.n+1)
        self.n += 1
        return None

    def __call__(self):
        return self.cma
    
    # 实现REPL输入实例直接返回数值
    def __repr__(self):
        return str(self.cma)
    
    def __str__(self):
        return str(self.cma)
    
    # 支持转换为float/int类型
    def __float__(self):
        return float(self.cma)
    
    def __int__(self):
        return int(self.cma)
    
    # 支持加法运算 实例 + 数值
    def __add__(self, other):
        return self.cma + other
    
    # 支持反向加法 数值 + 实例
    def __radd__(self, other):
        return self.__add__(other)

效果验证:

a = CumulativeMovingAverage()
a.add(2)
a.add(4)

# 第一个需求验证
print(a) # 输出3
# REPL环境下直接输入a也会显示3

# 第二个需求验证
b = a + 100
print(b) # 输出103

c = 100 + a
print(c) # 输出103

内容的提问来源于stack exchange,提问作者Vaaal88

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:36:03