我正在尝试实现一个子类,它会抛出错误:
TypeError: worker() takes 0 positional arguments but 1 was given
class KeyStatisticCollection(DataDownloadUtilities.DataDownloadCollection):
def GenerateAddressStrings(self):
pass
def worker():
pass
def DownloadProc(self):
pass
答案 0 :(得分:86)
您的worker
方法需要'self'作为参数,因为它是一个类方法而不是函数。添加它应该可以使它正常工作。
答案 1 :(得分:14)
如果方法不需要self
作为参数,则可以使用@staticmethod
装饰器来避免错误:
class KeyStatisticCollection(DataDownloadUtilities.DataDownloadCollection):
def GenerateAddressStrings(self):
pass
@staticmethod
def worker():
pass
def DownloadProc(self):
pass
请参阅https://docs.python.org/3/library/functions.html#staticmethod
答案 2 :(得分:11)
您忘记将self
作为参数添加到课程worker()
中的KeyStatisticCollection
函数中。
答案 3 :(得分:9)
尤其是当您没有将任何参数传递给方法时,这可能会造成混淆。那有什么呢?
当您在类(例如 plt.plot(x, y1)
plt.show()
)上调用方法时,Python 自动 将self作为第一个参数传递。
让我们再读一次:
当您在类(例如URIBuilder authorizationURI = new URIBuilder("http://localhost:8180/auth/realms/application_name/protocol/openid-connect/token");
WebClient webclient = WebClient.builder().build();
MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
formData.put("grant_type", Collections.singletonList("client_credentials"));
formData.put("client_id", Collections.singletonList("application_name"));
formData.put("client_secret", Collections.singletonList("tralala-5d0e-4bea-938b-884c1ce4c981"));
)上调用方法时,Python自动 传递self作为第一个参数
因此Python在这里说,嘿,我可以看到work()
接受0个位置参数(因为括号内没有任何内容),但是您知道work()
参数仍在传递自动。因此,您最好修复此问题,然后再将work()
关键字放回去。
添加self
应该可以解决此问题。 self
self
答案 4 :(得分:4)
class KeyStatisticCollection(DataDownloadUtilities.DataDownloadCollection):
def GenerateAddressStrings(self):
pass
def worker(self):
pass
def DownloadProc(self):
pass
答案 5 :(得分:1)
检查名称为method_a()的方法是否调用了具有相同名称method_a(with_params)的方法,导致递归
答案 6 :(得分:1)
每当我错误地使用 def
而不是 class
创建 Python 类时,我都会收到此错误:
def Foo():
def __init__(self, x):
self.x = x
# python thinks we're calling a function Foo which takes 0 args
a = Foo(x)
TypeError: Foo() takes 0 positional arguments but 1 was given
糟糕!
答案 7 :(得分:1)
只需在 def worker(): function 中传递 self 关键字
class KeyStatisticCollection(DataDownloadUtilities.DataDownloadCollection):
def GenerateAddressStrings(self):
pass
def worker(self):
pass
def DownloadProc(self):
pass
答案 8 :(得分:0)
此错误的另一个用例是在类定义中导入函数。这使得后续函数调用了类对象的一部分。在这种情况下,您可以在库导入函数上使用@staticmethod或直接对函数进行静态路径调用。参见下面的示例
在此示例中,“ self.bar()”将引发TypeError,但可以通过两种方式修复
# in lib.py
def bar():
print('something to do')
# in foo.py
class foo():
from .lib import bar
def __init__(self):
self.bar()
选项1:
# in lib.py
def bar():
print('something to do')
# in foo.py
class foo():
from .lib import bar
def __init__(self):
lib.bar()
选项2:
# in lib.py:
@staticmethod
def bar():
print('something to do')
# in foo.py
class foo():
from .lib import bar
def __init__(self):
self.bar()
答案 9 :(得分:0)
在进行Flask Basic身份验证时,我遇到了这个错误,然后我意识到我拥有wrapd_view(** kwargs),并且在将其更改为wrapped_view(* args,** kwargs)后可以正常工作。