파이썬 우주선게임 코드분석[1-1] 코드분석중 self에 대해서

이정민·2021년 4월 26일
0
<script>

class Fighter(pygame.sprite.Sprite):
	def __init__(self):
    	super(Fighter, self).__init__()
        self.image = pygame.image.load('fighter.png')
        self.rect = self.image.get_rect()
        self.rect.x = int(WINDOW_WIDTH / 2)
        self.rect.y = WINDOW_HEIGHT - self.rect.height
        self.dx = 0
        self.dy = 0
        
 def update(self):
 self.rect.x += self.dx
 self.rect.y += self.dy
 
 def draw(self, screen):
 	screen.blit(self.image, self.rect)
    
 def collide(self, sprites):
 	for sprite in sprites:
    	if pygame.sprite.collide_rect(self. sprite):
        	return sprite

</script>

우주선게임 코드를 분석하면서 궁금증이 생겼다. 유튜브에 있는 파이썬 기초강의를 들으면서 class안에 생성자를 만들때 self.변수이름과 메서드 매개변수에 self를 넣는것을 당연하게 생각하다가 왜 넣어야하고 self가 가리키는게 뭔지 궁금해졌고 이런것들을 모르기 때문에 이해하기가 어려워진다고 생각해서 한번 찾아보기로 했다.

<script>

class Human:
	def action1():
    	   print("공부 하자!")
    
	def action2(self):
    	   print("운동 하자!")

</script>

클래스 내에 정의된 함수를 메서드라고 부른다.
지금 현재 2개의 메서드가 정의된 Human class를 만들었다.
여기서 Human class의 action2메서드는 메서드의 매개변수가 self밖에 없어서
메서드를 호출할 때는 action2()의 괄호안에 아무것도 넣을 필요가 없다.


>>> lee = Human()
>>> lee.action2()

운동 하자!
>>>

여기서 메서드를 호출할 때 아무것도 전달하지 않는 이유는 self에 대한 값은 파이썬이 자동으로 넘겨주기 때문이라고 한다.

이번에는 매개변수가 없는 action1()을 인스턴스 메서드로 호출했을때
TypeError: action() takes 0 positional arguments but 1 was given 오류가 뜬다.
여기 뜻은 "받을 매개변수가 없는데 하나를 받았다."

이제 self가 무엇을 가리키는지 알기 위해서 내장함수인 id를 사용한다.

<script>

class Human:
	def action1():
   	   print("공부 하자!")
    
	def action2(self):
    	   print(id(self))
    	   print("운동 하자!")

</script>

>>> lee = Human()
>>> print(id(lee))
>>> lee.action2()

140501947994064
140501947994064
운동 하자!
>>>

생성된 인스턴스는 메모리 140501947994064에 할당되어 있다는것을 알 수 있다.
이 말은 변수 lee는 140501947994064주소값을 담고 있다는것과 동일하다고 이해했다.

그리고 id(self)도 140501947994064 값을 출력하는 것을 보고 클래스 내에 정의된
self는 클래스 인스턴스임을 알 수 있다.

lee = Human()

Human.action2(lee) 를 할 경우도 똑같은 결과를 얻을 수 있다.
self는 클래스의 인스턴스이기 때문에 Human의 인스턴스인 lee를 넣어주면 오류없이 출력되는걸 확인할 수 있다.

profile
안녕하세요.

0개의 댓글