클래스 메소드에 self를 적고 안적고는 무슨 차이인가요?


발생하는 문제 및 실행환경

파이참에서 코드를 짜니까 자동으로 self를 붙여주던데 이건 왜 해주는건가요?

self가 무슨 역할을 하길래 self를 빼면 에러가 나는 건지 궁금합니다.

소스코드

class Test(object):
  def method_one(self):
    print "Called method_one"

  def method_two(): #여기서 빨간 줄이 뜸...
    print "Called method_two"

a_test = Test()
a_test.method_one()
a_test.method_two() ##안됨
  • 2016년 02월 11일에 작성됨

조회수 246


1 답변


좋아요
0
싫어요
채택취소하기

self를 붙인 쪽을 bound, 안 붙인 쪽은 unbound 메소드라 합니다.

보통 멤버 함수를 호출하는 경우, bound 함수인 method_one()은 호출하면

a_test.method_one()

Test.method_one(a_test)

로 변환됩니다. 그래서 unbound 함수의 경우는 TypeError가 발생하지요.

에러내용

>>> a_test = Test() 
>>> a_test.method_two()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: method_two() takes no arguments (1 given)

저기서 method_two() takes no arguments (1 given)를 보시면 알겠지만 selfa_test를 받아주는 역할로 있어야 하는데 self가 없기 때문에 인자가 너무 많이 들어왔다는 겁니다.

self를 쓰기 싫으면 데코레이터를 써서 "이 메소드 method_two는 bound method를 만들지 마라"고 설정할 수 있습니다.

class Test(object):
    def method_one(self):
        print "Called method_one"

    @staticmethod
    def method_two():
        print "Called method two" #에러 사라짐
  • 2016년 02월 11일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close