When overloading a method: "TypeError: Missing 1 required positional argument"

When overloading a method: "TypeError: Missing 1 required positional argument"

我正在编写一些代码来拟合数据的分布,因为对于 Pareto 1 分布,theta 是固定的,我编写了以下代码:

class ParetoI:
    alpha = None
    theta = None

    def __init__(self, alpha, theta=.5):
        self.alpha = alpha
        self.theta = theta
        return

    def pdf(self, x):
        return ParetoI.pdf(self.alpha, x, self.theta)

    # Some other code

    @staticmethod
    def pdf(alpha, x, theta=.5):
        return alpha * theta ** alpha / x ** (alpha + 1)

然后在我的主例程中,在我对给定的样本数据进行分布拟合后,我尝试绘制密度:

# par1 = ParetoI(some_args)
x_range = np.linspace(.5, 80, 200)
plt.plot(x_range, par1.pdf(x_range), label='Pareto I')

但我收到以下错误:

TypeError: pdf() missing 1 required positional argument: 'x'

我认为这是某种原因,因为我从 par1.pdf 调用了广义的静态函数。我该如何修复此代码?我是否根本不允许使用与 class 方法同名的静态函数?我想这很容易通过简单地删除静态函数来解决,但我认为在不实例化对象以供进一步使用的情况下使用这些分布可能会很方便。这是糟糕的设计吗?

因此,如上所述,Python 的写法是:

def pdf(alpha, x, theta=.5):
    return alpha * theta ** alpha / x ** (alpha + 1)

class ParetoI:
    alpha = None
    theta = None

    def __init__(self, alpha, theta=.5):
        self.alpha = alpha
        self.theta = theta
        return

    def pdf(self, x):
        return pdf(self.alpha, x, self.theta)