TypeError: Отсутствует 1 обязательный позиционный аргумент: 'self'
Я новичок в python и ударил стену. Я последовал за несколькими учебниками, но не могу пройти мимо ошибки:
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 требует другого синтаксиса.
main scipt:
# test script
from lib.pump import Pump
print ("THIS IS A TEST OF PYTHON") # this prints
p = Pump.getPumps()
print (p)
Класс насоса:
import pymysql
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
Если я правильно понимаю, что "я" автоматически передается конструктору и методам. Что я здесь делаю неправильно?
Я использую Windows 8 с python 3.3.2
Ответы
Ответ 1
Вам нужно создать экземпляр класса здесь.
использование
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
Ответ 2
Сначала необходимо инициализировать его:
p = Pump().getPumps()
Ответ 3
Вы также можете получить эту ошибку, преждевременно принимая рекомендации PyCharm, чтобы аннотировать метод @staticmethod. Удалите аннотацию.
Ответ 4
Ключевое слово self в python аналогично ключевому слову this в c++/java/С#.
В Python 2 это делается неявно компилятором (yes python does compilation internally)
. Просто в Python 3 вам нужно explicitly
упомянуть об этом в конструкторе и функциях-членах. пример:
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()
Ответ 5
Работает и проще, чем любое другое решение, которое я вижу здесь:
Pump().getPumps()
Это замечательно, если вам не нужно повторно использовать экземпляр класса. Протестировано на Python 3.7.3.
Ответ 6
У меня была похожая проблема. Часть моего кода выглядела так:
class player(object):
def update(self):
if self.score == game.level:
game.level_up()
class game(object):
def level_up(self):
self.level += 1
Это также дало мне ошибку об отсутствии self
. Я решил это, набрав game.level_up(game)
вместо game.level_up()
.
Это должно работать и для вас, но я не уверен, что это рекомендуемый способ.