TypeError:缺少一个必需的位置参数:'

我无法通过错误:

Traceback (most recent call last):
File "C:\Users\Dom\Desktop\test\test.py", line 7, in <module>
p = Pump.getPumps()
TypeError: getPumps() missing 1 required positional argument: 'self'

我检查了几个教程,但似乎与我的代码没有任何不同。我唯一能想到的是Python 3.3需要不同的语法。

class Pump:


def __init__(self):
print("init") # never prints


def getPumps(self):
# Open database connection
# some stuff here that never gets executed because of error
pass  # dummy code


p = Pump.getPumps()


print(p)

如果我理解正确,self是自动传递给构造函数和方法的。我哪里做错了?

1373226 次浏览

您需要在这里实例化一个类实例。

使用

p = Pump()
p.getPumps()

小例子:

>>> class TestClass:
def __init__(self):
print("in init")
def testFunc(self):
print("in Test Func")




>>> testInstance = TestClass()
in init
>>> testInstance.testFunc()
in Test Func

你需要先初始化它:

p = Pump().getPumps()

您也可以通过过早地接受PyCharm的建议来注释一个方法@staticmethod来得到这个错误。删除注释。

Python中的self关键字类似于c++ / Java / c#中的this关键字。

在Python 2中,它是由编译器隐式完成的(是的,Python在内部进行编译)。 只是在Python 3中,你需要在构造函数和成员函数中提到它显式地。例子:< / p >
class Pump():
# member variable
# account_holder
# balance_amount


# constructor
def __init__(self,ah,bal):
self.account_holder = ah
self.balance_amount = bal


def getPumps(self):
print("The details of your account are:"+self.account_number + self.balance_amount)


# object = class(*passing values to constructor*)
p = Pump("Tahir",12000)
p.getPumps()

比我在这里看到的其他解决方案更简单:

Pump().getPumps()

如果您不需要重用类实例,这是非常好的。在Python 3.7.3上测试。

你可以像pump.getPumps()那样调用这个方法。通过在方法上添加@classmethod装饰器。类方法接收类作为隐式的第一个参数,就像实例方法接收实例一样。

class Pump:


def __init__(self):
print ("init") # never prints


@classmethod
def getPumps(cls):
# Open database connection
# some stuff here that never gets executed because of error

因此,只需调用Pump.getPumps()

在java中,它被称为static方法。

我得到了同样的错误如下:

test()缺少一个必需的位置参数:'self'

实例方法self时,我直接按类名调用它,如下所示:

class Person:
def test(self): # <- With "self"
print("Test")


Person.test() # Here

并且,当静态方法self时,我通过对象或直接通过类名调用它,如下所示:

class Person:
@staticmethod
def test(self): # <- With "self"
print("Test")


obj = Person()
obj.test() # Here


# Or


Person.test() # Here

所以,我用object调用实例方法,如下所示:

class Person:
def test(self): # <- With "self"
print("Test")


obj = Person()
obj.test() # Here

并且,我从静态方法中删除了self,如下所示:

class Person:
@staticmethod
def test(): # <- "self" removed
print("Test")


obj = Person()
obj.test() # Here


# Or


Person.test() # Here

然后,错误得到了解决:

Test

详细地,我为什么是“实例方法”;在Python中?< / >强解释了< >强劲我的答案< / >强中的实例方法,为Python中@classmethod vs @staticmethod解释了< >强劲我的答案< / >强中的< >强@staticmethod < / >强< >强@classmethod < / >强

如果跳过对象声明的括号(错别字),则会发生此错误。

# WRONG! will result in TypeError: getPumps() missing 1 required positional argument: 'self'
p = Pump
p.getPumps()

不要忘记泵对象的括号

# CORRECT!
p = Pump()
p.getPumps()