Coding

[Python] Self는 무엇일까?

Y30L 2023. 10. 29. 16:36

Dreamhack 웹 해킹 강의 중 Blind SQL Injection 부분의 코드를 보고 이때까지 해왔던 코딩과 다르다는 것을 느껴 코드 분석을 진행하고 Python에서 주로 사용하는 Class와 Self에 대해 추가적인 공부를 진행하였다.


[그림 1]은 Dreamhack에서 제공하는 코드이다. 해당 코드 내부를 자세히 보면 __init__ 함수에 첫번째 인자가 self인 것을 볼 수 있다.

import requests
import sys
from urllib.parse import urljoin
class Solver:
    """Solver for simple_SQLi challenge"""
    # initialization
    def __init__(self, port: str) -> None:
        self._chall_url = f"대상 사이트:{port}"
        self._login_url = urljoin(self._chall_url, "login")
    # base HTTP methods

 

1. Python에서 Self란?

Self는 단어의 의미 그대로 객체의 인스턴스 그 자체를 의미한다.(인스턴스에 대해서는 ⬇️⬇️)

더보기

인스턴스란?


사용자가 정의한 클래스를 사용하기 위해 생성하는 것으로 클래스가 붕어빵 틀이라면 인스턴스가 붕어빵에 해당한다. 인스턴스 이름 뒤에 ()를 넣으면 새로운 인스턴스가 생성된다.

생성예시는 다음과 같다.

Class A:
	print('A')
   
if __name__ == "__main__":
	a_instance = A() # 인스턴스 생성

일반적으로 클래스 내부에 정의된 함수인 메서드의 첫번째 인자는 반드시 self여야 한다는 방식으로 많이 알고 있다. 해당 개념은 틀린 개념도 아니며 무조건 맞는 개념도 아니다. 다음 코드를 통해 살펴보자

 

 

Test 클래스가 존재하고 test1, test2 메소드가 존재한다고 가정하자. 또한 Test 클래스에 인스턴스인 test_instance를 생성하였다.

class Test:
    def test1():
        print("test1")
    def test2(self):
        print("test2")
        
if __name__ == "__main__":
    test_instance = Test()

 

위 코드에서 아래 부분을 추가하여 test2() 함수를 호출하게 되면 "test2"가 정상적으로 출력된다.

if __name__ == "__main__":
    test_instance = Test()
    test_instance.test2() # 추가(test2() 실행)

이번에는 test2() 함수를 호출하는 것이 아니라 test1()을 호출하면 다음과 같은 오류가 발생한다.

Traceback (most recent call last):
  File "/test2.py", line 9, in <module>
    test_instance.test1()
TypeError: Test.test1() takes 0 positional arguments but 1 was given

 

2. 왜 오류가 발생할까?

Python의 경우 기본적으로 메서드의 첫번째 인자로 항상 인스턴스가 전달된다. test2()를 실행했을 때 첫번째 인자가 self이므로 오류가 발생하지 않는다. 하지만, test1()의 경우 인자가 존재하지 않았음에도 불구하고 인스턴스가 전달되어 오류가 발생한 것이다.

 

3. 결론

결론적으로 self는 객체의 인스턴스 그 자체를 의미하고 자기 자신을 참조하는 매개변수이다.

 

 

4. Reference

1. https://wikidocs.net/1742

 

3) self 이해하기

앞에서 클래스 내에 정의된 함수를 메서드라고 부른다고 했습니다. 그리고 메서드의 첫 번째 인자는 항상 self여야 한다고 했습니다. 하지만 메서드의 첫 번째 인자가 항상 self…

wikidocs.net

2. https://velog.io/@magnoliarfsit/RePython-1.-self-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0