我想在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/