这里的 add 和 mul 定义是无意义的,因为它们依赖于返回 self,导致无限循环。如果他们使用 lambdas 创建一个新的发行版,那么它可以正常工作,如下面我自己的回答所示。
我只是在玩类并试图构建一个小型统计工具。但是,当我运行此代码时,我陷入了__mul__
调用中正在运行的n1.pdf
调用内部的递归循环中,我无法弄清楚原因。我认为这与 Python 懒惰地执行__mul__
而不是做我“想要”的事情(让我们用 CS 语言说)有关,它是为 pdf 拥有的旧函数调用创建一个新指针指向pdf的新指针,然后将旧指针(主.pdf指针)设置为新函数。
我认为这措辞很糟糕,因此如果您理解我的要求,则非常欢迎进行编辑。
import math
import random
class Distribution:
def __init__(self, pdf, cdf):
self.pdf = pdf
self.cdf = cdf
def pdf(self, x):
return self.pdf(x)
def cdf(self, x):
return self.cdf(x)
def __mul__(self, other):
if isinstance(other, float) or isinstance(other, int):
newpdf = lambda x : self.pdf(x) * other
self.pdf = newpdf
newcdf = lambda x : self.cdf(x) * other
self.cdf = newcdf
return self
else:
return NotImplemented
def __add__(self, other):
self.pdf = lambda x : self.pdf(x) + other.pdf(x)
self.cdf = lambda x : self.cdf(x) + other.cdf(x)
return Distribution(self.pdf, self.cdf)
class Normal(Distribution):
def __init__(self, mean, stdev):
self.mean = mean
self.stdev = stdev
def pdf(self, x):
return (1.0 / math.sqrt(2 * math.pi * self.stdev ** 2)) * math.exp(-0.5 * (x - self.mean) ** 2 / self.stdev ** 2)
def cdf(self, x):
return (1 + math.erf((x - self.mean) / math.sqrt(2) / self.stdev)) / 2
def sample(self):
return self.mean + self.stdev * math.sqrt(2) * math.cos(2 * math.pi * random.random())
if __name__ == "__main__":
n1 = Normal(1,2)
n1half = n1 * 0.5
x = n1.pdf(1)
print(x)
ps我知道乘以0.5后不再是pdf,这不是问题。