Python抽象类重载__add__实现随机变量相加的标准方案
Python抽象类重载
__add__实现随机变量相加 需求描述
需要为抽象基类RandomVariable实现加法重载,达到以下效果:
- 两个随机变量子类实例执行
+运算后,返回新的随机变量实例 - 调用新实例的
sample()方法时,返回左右两个操作数分别调用sample()的结果之和 - 预期调用示例:
my_random_variable = NormalVariable() + ExponentialVariable()
初始代码框架:
import numpy as np from abc import ABC, abstractmethod class RandomVariable(ABC): @abstractmethod def sample(self): pass # 待补全__add__实现逻辑 class NormalVariable(RandomVariable): def __init__(self, mu=0, sigma=1): self.mu = mu self.sigma = sigma def sample(self): return np.random.normal(self.mu, self.sigma) class ExponentialVariable(RandomVariable): def __init__(self, scale=1): self.scale=scale def sample(self): return np.random.exponential(self.scale)
现有实现评估
你自行编写的代码逻辑完全正确,是该场景下的标准实现方式,核心逻辑通过专门的AddedVariable类存储相加的左右操作数,采样时分别采样再求和,完全符合需求,代码如下:
import numpy as np from abc import ABC, abstractmethod class RandomVariable(ABC): @abstractmethod def sample(self): pass def __add__(self, other): return AddedVariable(left=self, right=other) class NormalVariable(RandomVariable): def __init__(self, mu=0, sigma=1): self.mu = mu self.sigma = sigma def sample(self): return np.random.normal(self.mu, self.sigma) class ExponentialVariable(RandomVariable): def __init__(self, scale=1): self.scale=scale def sample(self): return np.random.exponential(self.scale) class AddedVariable(RandomVariable): def __init__(self, left, right): self.left = left self.right = right def sample(self): return self.left.sample() + self.right.sample()
可选优化项
如果需要覆盖更多使用场景,可以在现有基础上做少量扩展:
- 补充
__radd__反向加法方法,支持常量 + 随机变量的调用形式(比如1 + NormalVariable()) - 增加类型判断逻辑:如果
+另一侧的操作数不是随机变量实例,自动包装为返回固定值的常量随机变量,无需手动做类型转换 - 按相同逻辑扩展
__sub__、__mul__等其他算术运算方法,丰富随机变量的运算能力
扩展后的核心代码参考:
class ConstantVariable(RandomVariable): """固定值随机变量,采样永远返回传入的固定值""" def __init__(self, value): self.value = value def sample(self): return self.value class RandomVariable(ABC): @abstractmethod def sample(self): pass def __add__(self, other): # 非随机变量类型自动包装为常量 if not isinstance(other, RandomVariable): other = ConstantVariable(other) return AddedVariable(left=self, right=other) def __radd__(self, other): # 加法满足交换律,反向加法直接复用__add__逻辑 return self.__add__(other)
测试用例:
# 两个随机变量相加 rv_sum = NormalVariable() + ExponentialVariable() print(rv_sum.sample()) # 输出正态分布采样值 + 指数分布采样值 # 常量和随机变量相加 rv_const_sum = 3 + NormalVariable(mu=1, sigma=0) print(rv_const_sum.sample()) # 固定输出4.0
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

