python

파이썬에서 self가 꼭 필요할까?

게으른 the lazy 2022. 6. 9. 11:03

 

2008년이니까 거의 15년 전 일이긴 합니다만, 파이썬에서 self를 불편해하던 분이 있었습니다. 그래서 제안을 하게 됩니다. 제목이 상당히 자극적이네요. “Redundant is not Explicit” 우리말로 하면 “과잉과 명시明示는 동의어가 아니다” 정도일까요? 이 분의 제안은 아래와 같습니다.

  • 메서드 정의에 self를 강제하는 것은 파이써닉하지 않다.
  • 적어도 메서드 입력 파라미터에서는 self를 없앨 수 있지 않을까?
  • self를 키워드로 만들면 해결되지 않을까?

 

예를 들자면

 

class C:
    def meth(self, arg):
        self.val = arg
        return self.val

 

이렇게 쓰던 코드를

 

class C:
   def meth(arg):
      self.val = arg
      return self.val

 

이렇게 쓸 수 있게 만들자는 겁니다.

 


 

글이 올라온 지 한달 후 귀도 반 로썸이라는 분이 을 해줍니다. 뭐하는 분인지 몰라도 파이썬 좀 잘 하시나봐요? 귀도는 세 가지 근거를 들어서 self의 필요성을 설명합니다.

 

근거1: 이론적 동등성theoretical equivalency을 지킬 수 있다. (중요도: 하)

예를 들어 클래스 C의 인스턴스인 foo의 메서드 meth를 두 가지 방법으로 호출할 수 있습니다.

 

foo.meth(arg)
C.meth(foo, arg)

 

둘은 동일한 표현입니다. 아래 줄의 fooself 자리입니다.

 

근거2: 새로운 메서드를 동적으로 클래스에 집어넣을 수 있다. (중요도: 중)

global 함수인 meth를 클래스 C에 메서드로 등록할 수 있습니다. 아래 코드처럼 쓰면 됩니다.

 

# Define an empty class:
class C:
   pass
 
# Define a global function:
def meth(myself, arg):
   myself.val = arg
   return myself.val
 
# Poke the method into the class:
C.meth = meth

 

이제 클래스 C에서 메서드 meth를 사용할 수 있습니다. 심지어 meth를 등록하기 전에 생성한 C의 인스턴스에도 meth가 생깁니다. 신기하쥬?

 

근거3: 데코레이터 사용에 문제가 발생한다. (중요도: 상)

중요하다고 하니까 원문을 먼저 붙이겠습니다.

 

When a method definition is decorated, we don't know whether to automatically give it a 'self' parameter or not: the decorator could turn the function into a static method (which has no 'self'), or a class method (which has a funny kind of self that refers to a class instead of an instance), or it could do something completely different (it's trivial to write a decorator that implements '@classmethod' or '@staticmethod' in pure Python). There's no way without knowing what the decorator does whether to endow the method being defined with an implicit 'self' argument or not.

 

해석하자면, self를 명시적으로 쓰지 않아도 자동으로 self가 메서드에 전달되도록 하자는 제안은 아래의 문제가 있다는 것입니다.

  • 어떤 데코레이터는 메서드를 self가 필요없는 static method로 만듦
  • 어떤 데코레이터는 메서드를 클래스cls를 인자로 받는 class method로 만듦
  • 어떤 데코레이터는 둘다 아님
  • 그런데 문제는, pure python만으로도 @staticmethod@classmethod를 구현할 수 있음
  • 따라서 데코레이터가 붙은 메서드는 self를 넘겨야 하는지 말아야 하는지 판단할 수 없음
  • 그렇다고 함수 내부를 보고 self가 필요한지 아닌지를 판단하는 건 좋은 생각이 아닐 것임

 

참고로 이 논의 직후 파이썬 3.0이 나왔는데 귀도는 새 버전에 도입될 새로운 기능들은 반드시 구버전과 호환되어야backward compatible 한다고 명확히 말하고 있네요.

 

귀도의 답변 외에도 self의 필요성이 언급된 아래의 글들이 있으니 같이 읽어보시면 좋겠습니다.

Why do we need to pass self as a parameter while calling a class function (Python)?

(GeeksforGeeks) self in Python class

파이썬의 매력이 self를 쓰는 거라고 생각해요

 

※ 잘못된 부분이 있다면 지적 환영입니다.

 

더 읽기

@classmethod는 무엇인가?

 

- 게으른 파이썬