96

我正在尝试实现一个子类,它会引发错误:

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
4

11 回答 11

163

您的worker方法需要“self”作为参数,因为它是类方法而不是函数。添加它应该可以正常工作。

于 2013-09-19T01:13:14.017 回答
35

如果方法不需要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

于 2016-10-17T19:21:45.493 回答
20

您忘记将self作为参数添加到worker()类中的函数中KeyStatisticCollection

于 2013-09-19T01:12:03.270 回答
15

这可能会令人困惑,尤其是当您没有将任何参数传递给该方法时。那么给了什么?

当您调用类的方法时(例如work()在本例中),Python会自动将 self 作为第一个参数传递。

让我们再读一遍: 当您调用类的方法时(例如work()在本例中),Python会自动将 self 作为第一个参数传递

所以这里 Python 说,嘿,我可以看到它work()需要 0 个位置参数(因为括号内没有任何内容)但是你知道在调用方法时self参数仍然自动传递 。因此,您最好解决此问题并将该self关键字放回原处。

添加self应该可以解决问题。work(self)

class KeyStatisticCollection(DataDownloadUtilities.DataDownloadCollection):
def GenerateAddressStrings(self):
    pass    
def worker(self):
    pass
def DownloadProc(self):
    pass
于 2020-04-21T13:01:31.267 回答
6
class KeyStatisticCollection(DataDownloadUtilities.DataDownloadCollection):
def GenerateAddressStrings(self):
    pass    
def worker(self):
    pass
def DownloadProc(self):
    pass
于 2018-04-10T05:03:55.387 回答
2

每当我错误地使用def而不是创建 Python 类时,我都会收到此错误class

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

哎呀!

于 2021-01-22T23:55:50.850 回答
1

只需在 def worker() 中传递 self 关键字:函数

class KeyStatisticCollection(DataDownloadUtilities.DataDownloadCollection):
    def GenerateAddressStrings(self):
        pass    
    def worker(self):
        pass
    def DownloadProc(self):
        pass
于 2021-03-25T19:24:07.213 回答
1

检查是否从名称为 method_a() 的方法调用具有相同名称的方法 method_a(with_params) 导致递归

于 2019-09-02T11:18:43.133 回答
0

在进行 Flask Basic auth 时,我遇到了这个错误,然后我意识到我有 Wrapped_view(**kwargs),并且在将其更改为 Wrapped_view(*args, **kwargs) 后它工作了。

于 2020-11-06T11:09:21.633 回答
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()
于 2019-12-20T10:27:10.547 回答
0
 class KeyStatisticCollection():
     def GenerateAddressStrings(self):
         pass
     def worker():
         return blabla
     def DownloadProc(self):
         abc = self.GenerateAddressStrings()
         #abc = GenerateAddressStrings()#error
     blabla = worker()
     #blabla = self.worker()#error

我认为这是关于使用自我参数的更好解释

于 2022-01-07T19:06:15.833 回答