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().

Это должно работать и для вас, но я не уверен, что это рекомендуемый способ.