본문 바로가기

코딩/Python

[Python/파이썬] Class(클래스) 메서드 self 설명

반응형

※ 이 글을 쓰는 사람은 SW 비전공자입니다.

※ 개인 공부를 위해 정리하는 글이며, 작성한 코드들은 효율성, 깔끔함(?) 등과는 거리가 멀 수 있습니다.

 

2021.03.14 - [코딩/Python] - [Python/파이썬] Class(클래스) 기초 정리 - 1 : 개념, 사용법

2021.03.20 - [코딩/Python] - [Python/파이썬] Class(클래스) 기초 정리 - 2 : has-a 관계, 상속 개념

2021.03.21 - [코딩/Python] - [Python/파이썬] Class(클래스) 기초 정리 - 3 : 다중상속, super().__init__(), 메서드 오버라이딩

2021.03.22 - [코딩/Python] - [Python/파이썬] Class(클래스) 기초 정리 - 4 : 추상 클래스, 클래스 변수

2021.03.27 - [코딩/Python] - [Python/파이썬] Class(클래스) 메서드 self 설명


  이전에 파이썬 Class 내부 메서드 선언시 Self에 대해 설명한 적이 있다. 클래스의 메서드를 선언할 때는 무조건 Self를 첫번째 인수로 받아야한다고 설명을 했었는데 틀린 내용이었다.

 

  아래 자료는 구글링을하다가 위키독스의 '파이썬으로 배우는 알고리즘 트레이딩'이라는 책에서 Self에 대해 잘 다루고 있어서 참고하여 정리.(참고링크는 포스팅 하단에 기재)

 

  요약하자면 클래스 내부 메서드의 Self는 해당 클래스의 인스턴스를 그대로 가리키는 것이다. 아래 테스트 코드를 작성해보았다

 

 

<코드>

#무기 클래스
class Weapone:
    #id(self)는 self의 주소값을 나타낸다.
    def __init__(self, name):
        self.name = name
        print(name,"__init__ 메소드의 self 주소값은 : ", id(self))
        print("\n")

    def attack(self):
        print(self.name,"attack 메소드의 self 주소값은 : ", id(self))
        print("\n")

	#self를 인수로 받지 않고 클래스 메서드를 선언 가능하다.
    def attack2():
        print("attack2 함수")
        print("\n")

 

  -. 첫번째, 두번째 메서드  print문 안에 있는 id(self)는 self의 주소값을 나타낸다. 밑에서 설명하겠지만 인스턴스의 주소값이 된다.

 

  -. 세번째 attack2 함수는 self를 받지 않고 메서드를 선언하였다. 이전 포스팅에서 self를 무조건 인수를 넣어야 한다고 설명했지만 틀린 설명이다. self를 넣지 않아도 클래스 메서드 선언이 가능하며, 대신 attack2()를 호출하는 방법이 조금 다르다.

이 부분은 아래에서 설명.

 

-. 위 클래스에 이어 아래 인스턴스를 선언하는 코드를 작성하고 결과를 확인해보았다.

 

 

Case1.  self의 주소값과 인스턴스의 주소값 비교

 

 

<코드>

sword = Weapone("검")
print("인스턴스 검의 주소값은 :", id(sword)) #sword의 주소값 확인

axe = Weapone("도끼")
print("인스턴스 도끼의 주소값은 :", id(axe)) #axe의 주소값 확인

 

<결과>

검 __init__ 메소드의 self 주소값은 :  2502266791432
인스턴스 검의 주소값은 : 2502266791432

도끼 __init__ 메소드의 self 주소값은 :  2502266792008
인스턴스 도끼의 주소값은 : 2502266792008


##__init__에서 self의 주소값을 출력한 결과와 인스턴스의 직접 주소값을 출력한 결과 같음.
##즉, self는 인스턴스를 지칭한다.

 

-. 결과에서 보면 알겠지만 __init__ 메서드에서 출력한 결과와 직접 인스턴스 주소값을 출력한 결과가 같다.

-. 즉, self는 인스턴스를 직접 지칭하는 것을 알 수 있다.

 

 

Case2. __init__ 메서드가 아닌 attack 메서드를 통해 주소값 출력

 

 

<코드>

sword = Weapone("검")
print("인스턴스 검의 주소값은 :", id(sword)) #sword의 주소값 확인

#함수를 통해 self 의 주소값 확인(=sword의 주소값)
sword.attack() 


 

<결과>

검 __init__ 메소드의 self 주소값은 :  1650958137096
인스턴스 검의 주소값은 : 1650958137096
검 attack 메소드의 self 주소값은 :  1650958137096

 

-. __init__ 메서드에서 출력한 self의 주소값과 마찬가지로 attack 메서드로 출력하여도 self의 주소값은 같다.

 

 

Case3. 클래스 내부의 self를 인수로 받지 않는 메서드 출력해보기(attack2)

 

 

<코드>

sword = Weapone("검")
sword.attack2()

 

<결과>

#에러가 발생함. 왜냐면 attack2는 self를 받지 않으니까 인스턴스를 통해 접근하면 에러 발생
TypeError: attack2() takes 0 positional arguments but 1 was given

 

-.  위와 같이 self 가 없는 클래스 메서드를 인스턴스 sword를 통해 접근하려니 에러가 발생한다.  self가 인스턴스를 받는다고 위에서 설명했었는데 attack2 메서드는 self가 없기 때문에 인스턴스를 받을 수 없기 때문이다.

 

-.  self가 없는 클래스 메서드를 호출하려면 아래와 같이 클래스명을 통해 접근해야 한다.

 

Weapone.attack2() #클래스명 Weapone을 통해 직접 접근해야 됨

 

 

 


참고링크 : wikidocs.net/1742 파이썬으로 배우는 알고리즘 트레이딩

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

728x90