«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Code IT

Python - 상속 본문

Python & Django

Python - 상속

Codit 2019. 2. 3. 15:24
# 객체지향 프로그래밍에서 절대 빼놓을 수 없는 것, 그리고 가장 어려운 것. 그것은 상속이다.
# 사실, 상속을 이해할 때 우리가 흔히 알고있는 그 "상속"을 떠올리면 이해하기가 어렵다.
# 부모가 자식에게 물려주는 것을 이해하는 것은 어렵지 않다. 
# 그러나 반대로 자식이 부모에게 무언가를 얻어가는 것은 이해하기가 쉽지 않다.
# "상속"이란 재산권자체를 물려받는 것이기에 역순으로 이해하기가 쉽지 않다는 것이다.
# 불행히도, 상속에서는 역순으로 호출해야만 하는 상황이 적지 않다.

# 그래서 본 파트는 상속이 아니라 "확장"을 이해시켜주고 싶다.

# 확장은 한 클래스가 본래 가지고 있던 멤버변수나 메서드에 무엇인가를 더 추가하거나
# 본래가진 것을 수정하는 것을 말한다.
# 집에서 발코니 확장이나 거실/방 확장을 생각하면 편하다.

# 상속은 단순하다.

# 아래 특성을 가진 클래스 하나가 있다.
class Unit:
	name = None
	move_speed = 5
	attack_damage = 1
	attack_range = 1
	
	def move(self):
		print(self.name + "이(가) 이동합니다. 이동 속도 : " + str(self.move_speed))
		
	def attack(self):
		print(self.name + "이(가) 공격합니다. 공격 데미지 : " 
		+ str(self.attack_damage) + " 공격 범위 : " 
		+ str(self.attack_range))
		
	def stop(self):
		print(self.name + "이(가) 이동과 공격을 멈춥니다.")
		
# 이제 Unit 클래스를 확상해 SCV를 만들어 보자.
class SCV(Unit):
	
	def __init__(self):
		self.name = "SCV"
		self.move_speed = 3
		self.attack_damage = 3
		
	def attack(self):
		"""
		메서드 재정의 하기 (Method Overriding)
		"""
		print(self.name + "가 미네랄을 채취합니다.")
		
	def stop(self):
		"""
		메서드 재정의 하기 (Method Overriding)
		"""
		super().stop() # 부모클래스(Unit)의 stop 호출하기
		print(self.name + "가 미네랄 채취를 멈춥니다.")
		
	def build(self, name):
		"""
		메소드 확장(추가)
		"""
		print(self.name + "가 " + name + "을 짓습니다.")
		
# SCV는 Unit을 확장했으니 move, attack, stop 같은 메소드를 더 만들필요가 없다.
# 그냥 사용만 하면 된다.

scv = SCV()
scv.move()
scv.attack()
scv.stop()
scv.build("Factory")

print(type(scv))
print(scv.__dict__) # 인스턴스 정보 보기
print(issubclass(SCV, Unit)) # SCV가 Unit을 확장했는지 확인하기

'Python & Django' 카테고리의 다른 글

Python - Class Method, Instance Method  (0) 2019.02.03
Python - self  (0) 2019.02.03
Python - 실습 - 게시판 만들기 (클래스)  (0) 2019.01.31
Python - 실습 - 게시판 만들기 (함수)  (0) 2019.01.31
Python - class  (0) 2019.01.31
Comments