我想在python中实现一个简单的光学传播模型。规则是,如果我链接三个元素m0-> m1-> m2,则系统得到的结果是:


tau = tau0 * tau1 * tau2
B = B2 + B1 * tau2 + B0 * tau2 * tau1


(tau是传输,B是背景)。

我想实现__gt__运算符的重载,以便可以声明:

m0 = Mirror(0.9, 10)
m1 = Mirror(0.8, 11)
m2 = Mirror(0.7, 12)
x = m0 > m1 > m2


到目前为止,我写道:

class OpticalElement:
    def __init__(self, trans, background):
        self.trans = trans
        self.background = background

class Mirror(OpticalElement):
    def __gt__(self, other):
        if isinstance(other, Mirror):
            tau = self.trans * other.trans
            bkg = other.background + other.trans * self.background
            return Mirror(tau, bkg)
        else:
            return NotImplemented


但是,此代码似乎仅能获得最右边元素的传输和背景:

x = m0 > m1 > m2
x.trans


返回0.56,而我预期为0.504。
背景的行为相同,我得到的是19.7而不是25.3(忽略了第一个元素)。

你们对如何使用运算符重载实现多个链接元素有任何想法吗? (括号内有效,但我想使用更简洁的代码)。

谢谢!

安德鲁

最佳答案

m0 > m1 > m2等效于(m0 > m1) and (m1 > m2)

由于将m0 > m1视为True,因此and将测试m1 > m2并返回其值,即您得到的0.56。

您可以使用乘法运算符,它将按预期工作:

class OpticalElement:
    def __init__(self, trans, background):
        self.trans = trans
        self.background = background

class Mirror(OpticalElement):
    def __mul__(self, other):
        if isinstance(other, Mirror):
            tau = self.trans * other.trans
            bkg = other.background + other.trans * self.background
            return Mirror(tau, bkg)
        else:
            return NotImplemented

m0 = Mirror(0.9, 10)
m1 = Mirror(0.8, 11)
m2 = Mirror(0.7, 12)
x = m0 *m1 * m2
print(x.trans)
#0.504

关于python - 链式运算符重载,用于路径传播,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49296230/

10-13 09:20