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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:27:25