给出的参数与 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 的多态分派或仅仅是出于实际原因——比如不必同时导入两个 Sample
和 ratioDivision
从你的模块),你也可以把它变成 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()
函数。
我有一个名为 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 的多态分派或仅仅是出于实际原因——比如不必同时导入两个 Sample
和 ratioDivision
从你的模块),你也可以把它变成 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()
函数。