TypeError: Відсутній 1 необхідний позиційний аргумент: 'self'


217

Я новачок у пітоні і потрапив у стіну. Я дотримувався кількох навчальних посібників, але не можу пройти помилку:

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'

Я розглянув декілька навчальних посібників, але, схоже, немає нічого відмінного від мого коду. Єдине, про що я можу придумати, це те, що python 3.3 вимагає різного синтаксису.

головний наук:

# test script

from lib.pump import Pump

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

p = Pump.getPumps()

print (p)

Клас насоса:

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

Якщо я правильно розумію, "я" передається конструктору та методам автоматично. Що я тут роблю неправильно?

Я використовую Windows 8 з python 3.3.2

Відповіді:


281

Тут потрібно створити екземпляр класу.

Використовуйте

p = Pump()
p.getPumps()

Невеликий приклад -

>>> 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
Спробував це раніше, але пропав "()". Це нове в python 3.x?
DominicM

1
@DominicM: Ні, це завжди було.
Сукрит Кальра

1
Так, озираючись на підручники, за якими я стежив, мій мозок, мабуть, тільки-но
затупив

4
Назви класів повинні мати верхній регістр, тобто "testClass" має бути "TestClass"
eggonlegs

1
Дякую, мої проблеми були відсутніми дужками в екземплярах класів. Ваш приклад дуже зрозумілий.
Пол Уотсон

57

Спершу його потрібно ініціалізувати:

p = Pump().getPumps()

14
Простота часто недооцінена.
theaststcoastwest

14
Це зробить p рівним методу getPumps (), тоді як це буде запущено, p не буде "придатним для використання" як змінна для класу Pump (). Це не велика практика imo, оскільки це просто створення непотрібної змінної. Якщо єдиною метою є запуск функції getPumps, тоді вона буде працювати просто запуск Pump (). GetPumps () замість створення змінної для функції.
Ashmoreinc

7

Працює і простіше, ніж будь-яке інше рішення, яке я бачу тут:

Pump().getPumps()

Це чудово, якщо вам не потрібно повторно використовувати екземпляр класу. Тестовано на Python 3.7.3.


2

Ви також можете отримати цю помилку, передчасно скориставшись порадою PyCharm для анотації методу @staticmethod. Видаліть примітку.


1

«Я» ключове слово в пітон аналогічно «це» ключове слово в C ++ / Java / C #.

У python 2 це робиться неявно компілятором (yes python does compilation internally). Просто в python 3 вам потрібно згадати його explicitlyу функціях конструктора та члена. приклад:

 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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.