본문 바로가기
파이썬/기초문법

Python self 이해하기

by 행복론자 2020. 1. 23.

Python으로 클래스를 생성할 때 자주 보이는 self에 대해 알아보겠습니다.

 

간단히 바로 요약하자면

self란 클래스의 인스턴스를 나타내는 변수입니다. 

 

무슨 말인지는 천천히 예를 들면서 설명하겠습니다. 

self는 class내 method들의 첫번째 인자로 전달됩니다.

다른 언어들은 이 과정을 프로그래머 모르게 알아서 처리하기도 하지만 Python은 이를 명시적으로 프로그래머가 해줘야 합니다.

 

하지만 self를 전달하지 않은 메소드를 만들어도 상관 없습니다.

class Person:
    def sayHello():
        print('Hi')

 

다만 이렇게 만든 메소드를 호출하면 문제가 됩니다.

class Person:
    def sayHello():
        print('Hi')

man = Person()
man.sayHello()

#TypeError: sayHello() takes 0 positional arguments but 1 was given

 

 

에러의 뜻은 sayHello 메소드에 argument를 전달했는데 받는 처리를 안해서 문제랍니다.

그럼 self를 sayHello 메소드에 넣어보겠습니다.

class Person:
    def sayHello(self):
        print('Hi')

man = Person()
man.sayHello()

 

 

문제 없이 잘 수행됨을 알 수 있습니다.

여기서 알 수 있는 사실은 클래스의 메소드들은 self를 첫번째 인자로 받도록 해주어야합니다. 

Python이 자동으로 self를 전달하기 때문입니다. 

 

그렇다면 self는 어디에 위치해 있을까요?

객체의 메모리주소를 알아내는 id()함수를 사용해 어디에 있는지 알아보겟습니다. 

class Person:
    def sayHello(self):
        print(id(self)) #3130384
        print('Hi')

man = Person()
man.sayHello()

 

 

id(self)를 출력하면 self가 메모리 3130384번지에 저장되어 있다고 합니다.

그러면 인스턴스 man은 어디에 저장되어 있을까요? 한번 확인해보겠습니다.

class Person:
    def sayHello(self):
        print(id(self)) #3130384
        print('Hi')

man = Person()
man.sayHello()
print(id(man))

#3130384
#Hi
#3130384

* id()를 통해 나오는 주소값은 프로그램을 실행시킬 때마다 다릅니다.

 

결과를 확인하면 인스턴스 man의 주소와 self의 주소가 같습니다.

여기서 알 수 있는 점은 위에서 언급한바와 같이

man이나 self나 사실 같은 것입니다.

 

그러면 man이라는 인스턴스가 없이 클래스의 함수가 호출될 때는 어떨까요?

클래스는 인스턴스를 만들지 않아도(man = Person()을 통해 man 변수에 Person 객체를 담지 않아도) 네임스페이스를 따로 갖고 있기 때문에 Person.sayHello()처럼 호출할 수 있습니다.

 

한번 해보겠습니다.

class Person:
    def sayHello(self):
        print(id(self)) 
        print('Hi')

Person.sayHello()
#TypeError: sayHello() missing 1 required positional argument: 'self'

 

 

호출이 되기는 되는데 self를 전달하지 않아서 에러랍니다. 위에서 본 에러와 같습니다.

그러면 무엇을 전달해야할까요? self는 인스턴스라고 했기 때문에 인스턴스를 전달하면 되니다.

따라서, 인스턴스를 하나 만들어서 Person.sayHello()에 전달해보겠습니다.

class Person:
    def sayHello(self):
        print(id(self))
        print('Hi')

man = Person()
Person.sayHello(man)
print(id(man))

#6276112
#Hi
#6276112

 

 

Person.sayHello()를 통해 sayHello 메소드가 호출되기는 하나 인스턴스를 통해 호출한 것이 아니라

클래스를 통한 호출이라 Person.sayHello()는 인스턴스를 통한 호출 man.sayHello()과는 조금 다릅니다

내부에 참조할 self가 없어서 인스턴스를 하나 인자로 전달해야합니다. 

하지만 Person.sayHello() 역시 메소드를 정상적으로 호출할 수 있는 것은 마찬가지이기 때문에 

인자로 인스턴스를 잘 전달하면 문제없이 수행됨을 알 수 있습니다. 

 

참고로 여기서 전달되는 인스턴스는 꼭 Person 객체를 통해 만든 인스턴스가 아니어도 됩니다!

class Person:
    def sayHello(self):
        print(id(self)) #3130384
        print('Hi')

class Robot:
    life = 1000

bot = Robot()
man = Person()
Person.sayHello(bot)
print(id(man))

#잘만 됨 

 

 


같이 읽어보면 좋은 글

2022.12.27 - [파이썬/가상화폐] - [전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.

 

[전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.

🎁 바이낸스 자동매매 시스템 개발 방법을 담은 책이 출시되었습니다. "나 대신 일해주는 코인선물자동매매 프로그램 개발, 노하우 및 소스를 모두 공개합니다" ✔️ Q: 무슨 내용인가요? Python

jsp-dev.tistory.com

 

2022.11.05 - [파이썬/가상화폐] - [공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프리미엄

 

[공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프

https://kmong.com/gig/417785 거래소별 코인 프리미엄 알림봇 개발 가이드를 드립니다 | 36000원부터 시작 가능한 총 평점 5점의 3개 총 작업 개수 완료한 총 평점 5점인 JSDEV의 전자책, 투잡·재테크 전자

jsp-dev.tistory.com

 

2022.10.19 - [부업] - 비전공자를 위한 Python 기초책, 읽다보면 알게되는 파이썬 전자책!

 

비전공자를 위한 Python 기초책, 읽다보면 알게되는 파이썬 전자책!

✅전자책 링크 https://url.kr/ld89h7 * 프로그래밍을 배울까..? 망설인 적 있으신가요? 프로그래밍을 배워야 한다는 이야기는 수도 없이 들어봤지만 항상 망설이게 만드는 이유가 있습니다. “어렵지

jsp-dev.tistory.com

반응형
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글