给出的参数与 python 看到的不匹配

Arguments given do not match what python sees

我有一个名为 sample.py 的 python 文件,其中包含 class Sample 对象的定义。该对象具有各种变量和以下函数:

def ratioDivision(numerator, denominator):

然后,在我的主函数中(在另一个文件中),我声明了一个 样本对象 x,并尝试调用这个函数:

x.co2overco = x.ratioDivision(float(x.co2), float(x.co))

但是,我得到这个错误:

Traceback (most recent call last):


File "csvReader.py", line 192, in <module>
    main(sys.argv[1:])
  File "csvReader.py", line 79, in main
    x.co2overco = x.ratioDivision(float(x.co2), float(x.co))
TypeError: ratioDivision() takes exactly 2 arguments (3 given)

我看不出我是怎么给出三个参数的?引用有问题吗?

你的方法是一个实例方法。它的第一个参数应该是 self

def ratioDivision(self, numerator, denominator):

它看到3个参数,因为第一个参数是实例本身。

当属性查找(即 obj.name)引用作为 class 属性的函数时,属性解析机制会生成可调用的 method 对象而不是函数。这个 method 对象是函数和实例的包装器,当被调用时它会将实例作为第一个参数注入,所以在你的情况下

x.ratioDivision(1, 2)

变成

Sample.__dict__["ratioDivision"](x, 1, 2)

如果 ratioDivision 不需要对当前实例的任何访问权限,也不需要 class,您可以将其作为模块中的普通函数(Python 不是 Java 并且不需要所有内容都存在于 class) 中。

如果您仍然希望它可以通过 Sample 个实例访问(以支持基于 class 的多态分派或仅仅是出于实际原因——比如不必同时导入两个 SampleratioDivision 从你的模块),你也可以把它变成 staticmethod:

class Sample(object):
    @staticmethod
    def ratioDivision(numerator, denominator):
        return whatever

这就是说,给定您的示例用例,即:

x.co2overco = x.ratioDivision(float(x.co2), float(x.co))

您可能想向 Sample class 添加一个方法,例如 computeCo2overco()

class Sample(object):
    @staticmethod
    def ratioDivision(numerator, denominator):
        return whatever

    def computeCo2overco(self)
        self.co2overco = self.ratioDivision(float(self.co2), float(self.co))

或者如果 ratioDivision 并不昂贵,只需使用计算属性:

class Sample(object):
    @staticmethod
    def ratioDivision(numerator, denominator):
        return whatever

    @property
    def co2overco(self):
        return self.ratioDivision(float(self.co2), float(self.co))

在这种情况下,您可以使用:

whatever = x.co2coverco + something

在后台,它会调用 co2overco() 函数。