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
相关产品推荐
相关产品推荐

