Ошибка типа: отсутствует 1 обязательный позиционный аргумент: 'self'

219

Я новичок в 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 требует другого синтаксиса.

основной скипт:

# 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

DominicM
источник

Ответы:

283

Вам нужно создать экземпляр класса здесь.

использование

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
Сукрит Калра
источник
1
Пробовал это раньше, но отсутствовал "()". Это новое в Python 3.x?
DominicM
1
@DominicM: Нет, это всегда было там.
Сукрит Калра
1
Да, оглядываясь на учебники, которые я следовал, мой мозг, должно быть, только что отключил скобки :)
DominicM
4
имена классов должны быть в верхнем регистре, то есть, 'testClass' должен быть 'TestClass'
eggonlegs
1
Спасибо, пропущенные скобки при создании экземпляров были моей проблемой. Ваш пример супер ясен.
Пол Уотсон
57

Вы должны сначала инициализировать его:

p = Pump().getPumps()
JBernardo
источник
14
Простота часто недооценивается.
восточное побережье
14
Выполнение этого сделало бы p равным методу getPumps (), в то время как это запустило бы p, не будет «пригодным для использования» как переменная для класса Pump (). Это не очень хорошая практика, поскольку это просто создание бесполезной переменной. Если единственная цель состоит в том, чтобы запустить функцию getPumps, то она будет работать только при запуске Pump (). GetPumps () вместо создания переменной для функции.
Ashmoreinc
7

Работает и проще, чем любое другое решение, которое я вижу здесь:

Pump().getPumps()

Это замечательно, если вам не нужно повторно использовать экземпляр класса. Протестировано на Python 3.7.3.

Джей Д.
источник
2

Вы также можете получить эту ошибку, преждевременно приняв совет PyCharm для аннотирования метода @staticmethod. Удалить аннотацию

gherson
источник
1

«Я» ключевое слово в питон аналогично «это» ключевое слово в C ++ / Java / C #.

В 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()
Tahir77667
источник