TypeError: Faltando 1 argumento posicional necessário: 'self'

217

Eu sou novo em python e bati em uma parede. Segui vários tutoriais, mas não consigo passar pelo erro:

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'

Examinei vários tutoriais, mas não parece haver nada diferente do meu código. A única coisa que consigo pensar é que o python 3.3 requer sintaxe diferente.

scipt principal:

# test script

from lib.pump import Pump

print ("THIS IS A TEST OF PYTHON") # this prints

p = Pump.getPumps()

print (p)

Classe de bomba:

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

Se eu entendi corretamente "self" é passado para o construtor e métodos automaticamente. O que eu estou fazendo errado aqui?

Estou usando o Windows 8 com python 3.3.2

DominicM
fonte

Respostas:

281

Você precisa instanciar uma instância de classe aqui.

Usar

p = Pump()
p.getPumps()

Pequeno exemplo -

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


>>> testInstance = TestClass()
in init
>>> testInstance.testFunc()
in Test Func
Sukrit Kalra
fonte
1
Tentei isso antes, mas estava faltando "()". Isso é novo no python 3.x?
22813 DominicM
1
@DominicM: Não, isso sempre esteve lá.
Sukrit Kalra
1
Yup, olhando para tutoriais que se seguiram, meu cérebro deve ter apenas apaguei os suportes :)
DominicM
4
nomes de classe devem estar em maiúsculas, ou seja, 'testClass' deve ser 'TestClass'
eggonlegs
1
Obrigado, falta de parênteses na instanciação de classe foi o meu problema. Seu exemplo é super claro.
Paul Watson
57

Você precisa inicializá-lo primeiro:

p = Pump().getPumps()
JBernardo
fonte
14
A simplicidade é frequentemente subestimada.
theeastcoastwest
14
Fazer isso tornaria p igual ao método getPumps (), enquanto isso executaria p não seria 'utilizável' como uma variável para a classe Pump (). Isso não é uma boa prática, pois apenas cria uma variável inútil. Se o único objetivo é executar a função getPumps, funcionaria apenas executando Pump (). GetPumps () em vez de criar uma variável para a função.
Ashmoreinc
7

Funciona e é mais simples do que qualquer outra solução que vejo aqui:

Pump().getPumps()

Isso é ótimo se você não precisar reutilizar uma instância de classe. Testado em Python 3.7.3.

Jay D.
fonte
2

Você também pode obter esse erro seguindo prematuramente os conselhos do PyCharm para anotar um método @staticmethod. Remova a anotação.

gherson
fonte
1

A palavra-chave 'self' em python é análoga à palavra-chave 'this' em c ++ / java / c #.

No python 2, isso é feito implicitamente pelo compilador (yes python does compilation internally). É só que no python 3 você precisa mencioná-lo explicitlynas funções de construtor e membro. exemplo:

 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
fonte