我想用 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) 和 (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/