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'

몇 가지 자습서를 검토했지만 내 코드와 다른 것으로 보이지 않습니다. 내가 생각할 수있는 유일한 것은 파이썬 3.3에 다른 구문이 필요하다는 것입니다.

메인 scipt :

# 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

올바르게 이해하면 "self"가 생성자와 메소드에 자동으로 전달됩니다. 내가 여기서 뭘 잘못하고 있니?

파이썬 3.3.2에서 Windows 8을 사용하고 있습니다.

답변:


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
전에 시도했지만 "()"이 누락되었습니다. 파이썬 3.x의 새로운 기능입니까?
DominicM

1
@DominicM : 아니, 항상 거기에 있었다.
Sukrit Kalra

1
그래, 내가 따라온 튜토리얼을 되돌아 보면, 내 뇌는 대괄호를 막
았을 것이다.

4
클래스 이름은 'TestClass에'해야 즉, 대문자, 'TestClass에'를해야한다
eggonlegs

1
감사합니다. 클래스 인스턴스화에 괄호가 없으면 내 문제가되었습니다. 귀하의 예는 분명합니다.
Paul Watson

57

먼저 초기화해야합니다.

p = Pump().getPumps()

14
단순성은 종종 과소 평가됩니다.
theeastcoastwest

14
이렇게하면 p가 getPumps () 메소드와 동일 해지지 만 p는 Pump () 클래스의 변수로 '사용'할 수 없습니다. 쓸모없는 변수를 만드는 것만으로는 imo가 좋지 않습니다. getPumps 함수를 실행하는 것이 유일한 목표라면 함수에 대한 변수를 작성하는 대신 Pump (). getPumps ()를 실행하는 것만으로 작동합니다.
Ashmoreinc

7

작동하고 다른 모든 솔루션보다 간단합니다.

Pump().getPumps()

클래스 인스턴스를 재사용 할 필요가없는 경우에 좋습니다. 파이썬 3.7.3에서 테스트되었습니다.


2

@staticmethod 메소드에 주석을 달기 위해 PyCharm의 조언을 조기에 가져 와서이 오류를 얻을 수도 있습니다. 주석을 제거하십시오.


1

파이썬 의 'self' 키워드 는 c ++ / java / c #의 'this' 키워드와 유사합니다 .

파이썬 2에서는 컴파일러에 의해 암시 적으로 수행됩니다 (yes python does compilation internally). 파이썬 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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.