【问题标题】:When overloading a method: "TypeError: Missing 1 required positional argument"重载方法时:“TypeError: Missing 1 required positional argument”
【发布时间】:2022-01-06 18:34:05
【问题描述】:

我正在编写一些代码来拟合数据的分布,因为对于 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 调用了广义的静态函数。如何修复此代码?我是否根本不允许拥有与类方法同名的静态函数?我想这很容易通过简单地删除静态函数来解决,但我认为能够在不实例化对象以供进一步使用的情况下使用这些分布可能很方便。这是糟糕的设计吗?

【问题讨论】:

  • Python 不支持方法重载。目前尚不清楚您在这里期望什么。每次使用相同的名称时,它都会覆盖之前的内容。
  • 类方法和静态方法不能同名。只有一本字典。
  • 注意,您可以只创建一个常规函数,这通常是您在 Python 中所做的。 IMO staticmethod 的存在是因为一堆 Java 程序员抱怨
  • @juanpa.arrivillaga 它们也有利于不被数百万个函数名污染命名空间。

标签: python typeerror static-methods


【解决方案1】:

因此,如上所述,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)

【讨论】:

    猜你喜欢
    • 2018-05-19
    • 2016-05-09
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多