TypeError: Eksik 1 zorunlu konum bağımsız değişkeni: 'self'


217

Python'da yeniyim ve bir duvara çarptım. Ben birkaç öğreticiler takip ama hatayı geçemiyorum:

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'

Birkaç öğreticiyi inceledim ama kodumdan farklı bir şey yok gibi görünüyor. Aklıma gelen tek şey, python 3.3'ün farklı sözdizimi gerektirmesidir.

ana makas:

# test script

from lib.pump import Pump

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

p = Pump.getPumps()

print (p)

Pompa sınıfı:

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

Doğru anlıyorsam "öz" yapıcıya ve yöntemlere otomatik olarak aktarılır. Burada neyi yanlış yapıyorum?

Python 3.3.2 ile Windows 8 kullanıyorum

Yanıtlar:


281

Burada bir sınıf örneği başlatmanız gerekir.

kullanım

p = Pump()
p.getPumps()

Küçük örnek -

>>> 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
Daha önce denedim ama "()" eksikti. Python 3.x sürümünde yeni mi?
DominicM

1
@DominicM: Hayır, her zaman oradaydı.
Sukrit Kalra

1
Evet, takip ettiğim derslere tekrar baktığımda, beynimin köşeli parantezleri karartması gerekiyor :)
DominicM

4
sınıf adları büyük harf olmalıdır, yani 'testClass' 'TestClass' olmalıdır
eggonlegs

1
Teşekkürler, sınıf somutlaştırmasında eksik parantezler benim sorunumdu. Örneğiniz çok açık.
Paul Watson

57

İlk önce başlatmanız gerekir:

p = Pump().getPumps()

14
Sadelik genellikle yetersiz değerlendirilir.
theeastcoastwest

14
Bunu yapmak p'nin getPumps () yöntemine eşit olmasını sağlarken, bu p'yi çalıştırmak Pump () sınıfı için bir değişken olarak 'kullanılabilir' olmaz. Bu, işe yaramaz bir değişken yarattığı için imo değildir. Tek hedef getPumps işlevini çalıştırmaksa, işlev için bir değişken oluşturmak yerine sadece Pump (). GetPumps () işlevini çalıştırmak çalışır.
Ashmoreinc

7

Burada gördüğüm diğer tüm çözümlerden daha kolay ve daha basit:

Pump().getPumps()

Bir sınıf örneğini yeniden kullanmanız gerekmiyorsa bu harikadır. Python 3.7.3 üzerinde test edilmiştir.


2

Bu hatayı, PyCharm'ın @staticmethod yöntemine açıklama eklemek için erkenden tavsiye alarak da alabilirsiniz. Ek açıklamayı kaldırın.


1

Python'daki 'self' anahtar kelimesi, c ++ / java / c # içindeki 'this' anahtar kelimesine benzer .

Python 2'de derleyici tarafından örtük olarak yapılır (yes python does compilation internally). Sadece python 3'te explicitlyyapıcı ve üye işlevlerinde bahsetmeniz gerekir . misal:

 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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.