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

조회수 6580회

발생하는 문제 및 실행환경

파이참에서 코드를 짜니까 자동으로 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() ##안됨

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" #에러 사라짐
    

답변을 하려면 로그인이 필요합니다.

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.