Python 从类“uuu init”调用staticmethod导致;取1个位置参数,但取2个;打字错误
我使用staticmethod创建了一个类:Python 从类“uuu init”调用staticmethod导致;取1个位置参数,但取2个;打字错误,python,visual-studio-code,static-methods,Python,Visual Studio Code,Static Methods,我使用staticmethod创建了一个类: class DetfileDetector(Detector): def __init__(self, file_path, **kwargs): super().__init__(**kwargs) self.detections = self.parse_detfile(file_path) @staticmethod def parse_detfile(file_path):
class DetfileDetector(Detector):
def __init__(self, file_path, **kwargs):
super().__init__(**kwargs)
self.detections = self.parse_detfile(file_path)
@staticmethod
def parse_detfile(file_path):
#do somthing with file_path
当我调用parse\u dirite
而不实例化类时,我得到了预期的结果
DetfileDetector.parse_detfile('foo.txt')
但是,当我从init()函数调用它时,我得到了错误:
TypeError:parse_detfile()接受1个位置参数,但2个位置参数无效
给定
我假设其含义是“self”也被传递给staticmethod,但这是一个staticmethod,因此我希望self不会被传递
我试图修复的是将“file_path”设置为可选参数,默认值为None,但我得到了一个typeroor
TypeError:parse_detfile()为参数“file_path”获取了多个值
如果有人能告诉我如何正确书写,我将不胜感激
编辑:感谢您的回答,添加更多信息:
- 现在我看到,当我从VScode的“python interactive shell”(版本1.50.0-insider)运行它时,它失败了,但当从命令行或不使用interactive shell运行它时,它会通过。我将向VScode开发人员报告这个问题
- 我正在使用python 3.7.7
检测器的内容
class Detector:
def __init__(self, **kwargs):
self.every = kwargs.pop('every', 1)
self.min_confidence = kwargs.pop('min_confidence', .8)
self.min_wh = kwargs.pop('min_wh', 5)
self.min_ar = kwargs.pop('min_ar', .1)
self.sensor_noise_cov = np.square(np.diag(kwargs.pop('sensor_noise', [10, 10, 1, 10])))
self.classes = object_classes(kwargs.pop('cars_only', True))
将您的代码更改为此,它应该可以工作
class DetfileDetector(Detector):
def __init__(self, file_path, **kwargs):
super().__init__(**kwargs)
self.detections = DetfileDetector.parse_detfile(file_path)
@staticmethod
def parse_detfile(file_path):
#do somthing with file_path
这是因为您从\uuuu init\uuuu
调用了self.parse\u detfile(file\u path)
。在那里也使用DetfileDetector.parse_detfile()
问题是,在self
上调用方法会神奇地将self
作为第一个参数附加到该方法
我假设其含义是“self”也被传递给staticmethod,但这是一个staticmethod,因此我希望self不会被传递
对
staticmethod
的一半要点是不需要实例。但是,它仍然是类的属性,而不是顶级函数,因此:
如果有人能告诉我如何正确书写,我将不胜感激
您需要在类中查找它,因此:
def __init__(self, file_path, **kwargs):
super().__init__(**kwargs)
self.detections = DetfileDetector.parse_detfile(file_path)
是的,可以说有点尴尬。但是,staticmethod
的另一半要点是,您实际上以这种方式将方法与类关联起来。如果这看起来不是一个好处,你可以考虑只在类之外做一个简单的顶层函数。 我认为这个问题不是来自你所显示的代码。在Python 3.6上进行了测试,结果如下:
类检测器:
通过
类DetfileDetector(检测器):
定义初始化(自身、文件路径,**kwargs):
超级()
self.detections=self.parse_detfile(文件路径)
@静力学方法
def parse_detfile(文件路径):
#对文件路径执行某些操作
打印(文件路径)
DetfileDetector('get.txt')
#get.txt
DetfileDetector.parse_detfile('tex.txt'))
#tex.txt
在VSCode中,在init和parse_detfile的代码上添加断点,并在调试模式下运行代码以查看变量
因此,检查检测器
,看看问题是否存在。您的代码实际上是正确的
我用Python3.8测试了它,没有发现任何问题
可以使用该类或该类的实例调用staticmethod
请看这里:
即使在较旧版本的Python中,它也是这样工作的,我一直检查到Python2.7。
所以你为什么会犯这样的错误有点神秘
也许可以提供更多关于代码的上下文信息?我无法重现您的错误。它的工作原理如我下面的回答所示。你能分享Detector
class的内容吗?@PraysonW.Daniel我用Detector
编辑了这个问题,最好使用self.detections=self.parse_detfile(file\u path)
,因为它不需要在代码中硬编码类名(如果包含类的名称不断更改,则不需要修改)。这也是我的建议。问题不在提交的代码中here@PraysonW.Daniel我们在同一页上。我很好奇这个问题是从哪里来的。我也很好奇。也许是检测器中的某个东西
?谢谢Prayson W.Daniel和Hocli的回答,我用更多信息编辑了这个问题