LoạiError: Thiếu 1 đối số vị trí bắt buộc: 'tự'


217

Tôi mới làm quen với trăn và đã va vào tường. Tôi đã làm theo một số hướng dẫn nhưng không thể vượt qua lỗi:

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'

Tôi đã kiểm tra một số hướng dẫn nhưng dường như không có gì khác với mã của tôi. Điều duy nhất tôi có thể nghĩ là python 3.3 yêu cầu cú pháp khác nhau.

scipt chính:

# test script

from lib.pump import Pump

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

p = Pump.getPumps()

print (p)

Lớp bơm:

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

Nếu tôi hiểu chính xác thì "tự" được chuyển đến hàm tạo và các phương thức tự động. Tôi làm gì sai ở đây?

Tôi đang sử dụng windows 8 với python 3.3.2

Câu trả lời:


280

Bạn cần khởi tạo một thể hiện của lớp ở đây.

Sử dụng

p = Pump()
p.getPumps()

Ví dụ nhỏ -

>>> 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
Đã thử điều đó trước đây nhưng đã mất tích "()". Có phải đó là mới trong python 3.x?
Đaminh

1
@DominicM: Không, điều đó đã luôn ở đó.
Sukrit Kalra

1
Yup, nhìn lại các hướng dẫn tôi đã làm theo, bộ não của tôi chắc chắn đã bị bôi đen dấu ngoặc :)
DominicM

4
Tên lớp nên viết hoa, nghĩa là 'testClass' phải là 'TestClass'
eggonlegs

1
Cảm ơn bạn, thiếu dấu ngoặc đơn trong phần khởi tạo lớp là vấn đề của tôi. Ví dụ của bạn là siêu rõ ràng.
Paul Watson

57

Bạn cần khởi tạo nó trước:

p = Pump().getPumps()

14
Đơn giản thường được đánh giá thấp.
theeastcoastwest

14
Làm điều này sẽ làm cho p bằng với phương thức getPumps (), trong khi điều này sẽ chạy p sẽ không thể sử dụng được như một biến cho lớp Pump (). Đây không phải là thực hành tuyệt vời imo vì nó tạo ra một biến vô dụng. Nếu mục tiêu duy nhất là chạy hàm getPumps, thì nó sẽ hoạt động chỉ khi chạy Pump (). GetPumps () thay vì tạo một biến cho hàm.
Ashmoreinc

7

Hoạt động và đơn giản hơn mọi giải pháp khác tôi thấy ở đây:

Pump().getPumps()

Điều này thật tuyệt nếu bạn không cần sử dụng lại một thể hiện của lớp. Đã thử nghiệm trên Python 3.7.3.


2

Bạn cũng có thể gặp lỗi này bằng cách sử dụng sớm lời khuyên của PyCharm để chú thích một phương thức @staticmethod. Xóa chú thích.


1

Các 'tự' từ khóa trong python là tương tự như 'này' từ khóa trong c ++ / Java / C #.

Trong python 2, nó được thực hiện hoàn toàn bởi trình biên dịch (yes python does compilation internally). Chỉ là trong python 3, bạn cần đề cập đến nó explicitlytrong hàm tạo và hàm thành viên. thí dụ:

 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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.