이번 포스팅은 python을 사용하며 클래스에서 self의 이해를 깊게 하기 위해 정리한 것입니다.
self
- self는 class를 포스팅할 때 썼지만 처음에는 클래스에 정의된 함수인 메서드의 첫 번째 인자는 self 다!라고 외우고 지나갔습니다. 하지만 사용하면 할수록 self는 계속 나오는데 이해는 안 되고 하여 정리하고자 합니다.
- 결론을 얘기하자면 self는 클래스의 인스턴스 그 자체를 말합니다. 즉, 객체 자기 자신을 참조하는 매개변수입니다.
예시를 들어 알아보겠습니다.
- self를 전달하지 않는 메서드
class Food:
def eatPizza():
print('yam')
good = Food()
good.eatPizza()
- 결과
에러는 eatPizza 메서드에 arguments를 전달했지만 받는게 없어서 문제가 발생했습니다.
- eatPizza에 self 매개변수를 전달
class Food:
def eatPizza(self):
print('yam')
good = Food()
good.eatPizza()
- 결과
문제 없이 잘 수행된 것을 볼 수 있고
알 수 있는 것은 클래스의 메서드에 self를 첫 번째 인자로 받도록 해주어야 하는 것입니다.
또한 우리가 매개변수에 self를 쓰지 않아도 파이썬에서 자동으로 self를 전달한 것을 볼 수 있습니다.
그러면 self는 어디에 있을까요?
self의 위치
- 앞서 포스팅 했던 객체의 주소를 알려주는 id() 함수를 이용하여 위치를 알아보겠습니다.
class Food:
def eatPizza(self):
print('self id : ',id(self))
print('yam')
good = Food()
good.eatPizza()
print('good id : ', id(good))
- 결과
결과를 확인해보니 인스턴스 good의 주소와 self의 주소가 같은 것을 볼 수 있습니다.
여기서 알 수 있는 점은 good과 self가 같다는 점입니다!
- 인스턴스 없이 클래스 함수 호출될 경우
class Food:
def eatPizza(self):
print('self id : ',id(self))
print('yam')
Food.eatPizza()
- 결과
good이라는 인스턴스가 없이 클래스의 함수를 호출했더니 에러가 발생했습니다!
이 에러는 앞서 self 없이 호출하여 에러가 발생한 것과 같습니다. self를 전달하지 않아 발생하는 에러입니다!
즉, 클래스는 인스턴스를 만들지 않아도(good = Food()를 통해 good 변수에 Food 객체를 담지 않아도) 호출은 할 수 있지만 self를 전달하지 않아 에러가 발생하는 결과를 얻었습니다.
어떻게 해결해야 할까요?
- self는 인스턴스라고 했습니다. 그러므로 인스터스를 전달해주면 됩니다.
class Food:
def eatPizza(self):
print('self id : ',id(self))
print('yam')
good = Food()
print('good id : ',id(good))
Food.eatPizza(good)
- 결과
결과는 위에서 good을 만들어 good.eatPizza()를 실행한 것과 같지만 Food.eatPizza()와는 조금 다릅니다.
여기서 전달되는 인스턴스는 Food 객체를 통해 만든 인스턴스가 아니어도 결과를 얻을 수 있습니다!
class Food:
def eatPizza(self):
print('self id : ',id(self))
print('yam')
class test :
print('test')
test = test()
good = Food()
good.eatPizza()
print('good id : ', id(good))
Food.eatPizza(test)
- 결과
self에 대해 이해를 잘 하지못했었는데 정리를 통해
어느 정도 이해를 할 수 있게 되었습니다.
틀린 부분이나 질문이 있으시면 댓글로 남겨주세요!
감사합니다 :)
'Python > Python 정리' 카테고리의 다른 글
[Python] zip() 이해 (0) | 2022.04.28 |
---|---|
[Python] enumerate 이해 (0) | 2021.08.07 |
[Python] ID 함수 정리 (0) | 2021.07.26 |
[Python] Lambda(람다) 표현식 (0) | 2021.07.01 |
[Python] 자료형을 확인하는 isinstance() (0) | 2021.06.27 |