TypeError: Hilang 1 diperlukan argumen posisi: 'diri'

218

Saya baru mengenal python dan telah menabrak dinding. Saya mengikuti beberapa tutorial tetapi tidak bisa melewati kesalahan:

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'

Saya memeriksa beberapa tutorial tetapi sepertinya tidak ada yang berbeda dari kode saya. Satu-satunya hal yang dapat saya pikirkan adalah bahwa python 3.3 memerlukan sintaks yang berbeda.

skrip utama:

# test script

from lib.pump import Pump

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

p = Pump.getPumps()

print (p)

Kelas 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

Jika saya mengerti benar "diri" dilewatkan ke konstruktor dan metode secara otomatis. Apa yang saya lakukan salah di sini?

Saya menggunakan windows 8 dengan python 3.3.2

Dominasi
sumber

Jawaban:

283

Anda perlu membuat instance instance kelas di sini.

Menggunakan

p = Pump()
p.getPumps()

Contoh kecil -

>>> 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
sumber
1
Mencoba itu sebelumnya tetapi hilang "()". Apakah itu baru dalam python 3.x?
DominicM
1
@ DominicM: Tidak, itu selalu ada di sana.
Sukrit Kalra
1
Yup, melihat kembali tutorial yang saya ikuti, otak saya pasti baru pingsan kurung :)
DominicM
4
nama kelas harus huruf besar, yaitu, 'testClass' harus 'TestClass'
eggonlegs
1
Terima kasih, tanda kurung yang hilang pada Instansiasi kelas adalah masalah saya. Contoh Anda sangat jelas.
Paul Watson
57

Anda perlu menginisialisasi terlebih dahulu:

p = Pump().getPumps()
JBernardo
sumber
14
Kesederhanaan sering dinilai rendah.
theeastcoastwest
14
Melakukan ini akan membuat p sama dengan metode getPumps (), sementara ini akan menjalankan p tidak akan 'dapat digunakan' sebagai variabel untuk kelas Pump (). Ini bukan praktik yang baik karena hanya menciptakan variabel yang tidak berguna. Jika satu-satunya tujuan adalah menjalankan fungsi getPumps, maka itu akan berfungsi hanya menjalankan Pump (). GetPumps () alih-alih membuat variabel untuk fungsi tersebut.
Ashmoreinc
7

Bekerja dan lebih sederhana daripada solusi lain yang saya lihat di sini:

Pump().getPumps()

Ini bagus jika Anda tidak perlu menggunakan instance kelas. Diuji pada Python 3.7.3.

Jay D.
sumber
2

Anda juga bisa mendapatkan kesalahan ini dengan mengambil saran PyCharm sebelum waktunya untuk menjelaskan metode @staticmethod. Hapus anotasi.

gherson
sumber
1

Kata kunci 'diri' dalam python adalah analog dengan kata kunci 'ini' di c ++ / java / c #.

Dalam python 2 itu dilakukan secara implisit oleh kompiler (yes python does compilation internally). Hanya saja di python 3 Anda perlu menyebutkannya explicitlydi konstruktor dan fungsi anggota. contoh:

 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
sumber