TypeError: manca 1 argomento posizionale obbligatorio: 'self'


236

Sono nuovo in Python e ho sbattuto contro un muro. Ho seguito diversi tutorial ma non riesco a superare l'errore:

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'

Ho esaminato diversi tutorial ma non sembra esserci nulla di diverso dal mio codice. L'unica cosa a cui riesco a pensare è che Python 3.3 richiede una sintassi diversa.

scipt principale:

# test script

from lib.pump import Pump

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

p = Pump.getPumps()

print (p)

Classe pompa:

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 capisco correttamente "self" viene passato automaticamente al costruttore e ai metodi. Cosa sto facendo di sbagliato qui?

Sto usando Windows 8 con Python 3.3.2

Risposte:


309

È necessario creare un'istanza di una classe qui.

Uso

p = Pump()
p.getPumps()

Piccolo esempio -

>>> 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
Ho provato prima ma mancava "()". È nuovo in python 3.x?
DominicM

2
@DominicM: No, è sempre stato lì.
Sukrit Kalra

1
Sì, guardando indietro ai tutorial che ho seguito, il mio cervello deve aver appena oscurato le parentesi :)
DominicM

mancava il ()
s2t2

66

Devi prima inizializzarlo:

p = Pump().getPumps()

16
La semplicità è spesso sottovalutata.
aetheus

14
Fare questo renderebbe p uguale al metodo getPumps (), mentre questo eseguirebbe p non sarebbe 'utilizzabile' come variabile per la classe Pump (). Questa non è una grande pratica poiché è solo la creazione di una variabile inutile. Se l'unico obiettivo è eseguire la funzione getPumps, allora funzionerebbe semplicemente eseguendo Pump (). GetPumps () invece di creare una variabile per la funzione.
Ashmoreinc

1
@Ashmoreinc ​​No, questo è puguale al valore di ritorno del metodo getPumps(), che è esattamente ciò che dovrebbe fare il codice di OP.
wjandrea

7

Funziona ed è più semplice di ogni altra soluzione che vedo qui:

Pump().getPumps()

Questo è ottimo se non hai bisogno di riutilizzare un'istanza di classe. Testato su Python 3.7.3.


2

Puoi anche ottenere questo errore prendendo prematuramente il consiglio di PyCharm di annotare un metodo @staticmethod. Rimuovi l'annotazione.


1

La selfparola chiave in Python è analoga alla thisparola chiave in C ++ / Java / C #.

In Python 2 è fatto implicitamente dal compilatore (sì, Python fa la compilazione internamente). È solo che in Python 3 è necessario menzionarlo esplicitamente nel costruttore e nelle funzioni membro. esempio:

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

Non è una parola chiave, solo una convenzione.
wjandrea

Cosa intendi con "In Python 2 è fatto implicitamente dal compilatore" ? AFAIK Python 2 non è mai stato impostato in modo selfimplicito.
wjandrea

0

Puoi chiamare il metodo come pump.getPumps(). Aggiungendo @classmethoddecoratore sul metodo. Un metodo di classe riceve la classe come primo argomento implicito, proprio come un metodo di istanza riceve l'istanza.

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

Quindi, chiama semplicemente Pump.getPumps().

In Java, è definito come staticmetodo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.