상속을 위해 두개의 실습을 진행하였다.
실습 1
클래스 객체와 상속에 대한 설명을 바탕으로 하여 아래와 같은 요구사항을 중족하는 코드를 작성하였다.
1. 포켓몬(기반클래스), 파이리(파생클래스)이다.
2. 기반클래스는 멤버변수로 최대체력을 가지고 있고, 이대 최대 체력은 300이다.
3. 파생클래스는 멤버변수로 이름과 현재체력을 가지고 있다. 이름은 "파이리"로 고정이며, 체력은 입력받을 수 있다.
4. 파이리는 메서드로 game()와 heal()을 가지고 있다.
5. game()는 100~199중의 랜덤값을 데미지로 주며, 객체의 현재 체력이 0 이하인 경우 게임이 불가능하다.
6. heal()은 객체의 현재 체력을 최대체력까지 회복할 수 있다.
7. 위의 내용을 반영한 파이리 1마리를 생성하여 게임 회수를 입력받고, game() 혹은 heal()가 회수만큼 수행될 수 있도록 하라.
import random as r #랜덤을 위한 import
# 부모클래스
class Pocketmon:
#부모생성자를 통해 최대 체력을 멤버변수로 갖는다.
def __init__(self):
self.maxHp=300
print("부모생성자")
# 자식클래스
class Charmander(Pocketmon):
name="파이리" #모든 Charmander의 이름은 파이리, 공통자원(클래스변수)
def __init__(self, hp): #객체 생성시 hp를 입력받을 수 있다.
#부모생성자를 호출하여 최대체력의 변수정보를 불러올 수 있다.
super(Charmander, self).__init__()
self.hp=hp
# 이때 이 입력이 0이하거나 최대체력을 초과할 수 없다.
if self.hp>self.maxHp or self.hp<0:
self.hp=self.maxHp
print("자식생성자")
def game(self):
# 게임실행 전 hp가 0이하라면, 게임 불가능
if self.hp <= 0:
print("현재 hp가 0이하이므로, 게임을 진행할 수 없습니다.")
return
demage=r.randrange(100,200)
self.hp-=demage
print("피해량: ", demage)
# 게임실행 후 hp가 0이하라면,
if self.hp <= 0:
self.hp=0
print("심각한 부상으로 전투 불능상태입니다.")
def heal(self):
self.hp=self.maxHp
print("당신의 "+Charmander.name+"가 회복되었습니다.")
##==================객체 생성 및 메서드 사용==================##
mon=Charmander(400)
num=int(input("실행할 게임 회수를 입력해주세요 >>"))
# 입력받은 회수만큼 game()혹은 heal()을 실행
for i in range(num):
flag=r.randrange(1,3)
if flag==1:
mon.game()
elif flag==2:
mon.heal()
print("현재상태: ", mon.hp)
super을 통해 자식생성자 내부에 부모생성자를 호출함으로써 부모클래스의 maxHp변수의 정보를 참조할 수 있게 된다.
프로그램 실행 결과는 아래와 같다.
실습 2
슈퍼클래스 Car를 상속받는 Hybrid객체를 생성하여
멤버변수 oil을 충전하는 addOil()와 멤버변수 battery를 충전하는 charge(), 현재 상태를 확인할 수 있는 hybrid_info()메서드를 가질 수 있도록 아래의 코드를 작성하였다.
# 슈퍼클래스(Car)
class Car:
max_oil=50 # 최대주유량
# 부모생성자
def __init__(self, oil):
self.oil=oil
def addOil(self, oil):
# 0이하의 주유는 진행하지 않음
if oil<=0:
return
self.oil+=oil
# 주유 후 최대 주유량 초과상태이면,
# 현재 주유량을 최대주유량으로 설정
if self.oil > Car.max_oil:
self.oil=Car.max_oil
def car_info(self):
print("현재 주유상태: {}".format(self.oil))
# 서브클래스(Hybrid)
class Hybrid(Car):
max_battery=30 # 최대충전량
# super로 부모생성자를 참조함으로써, 부모생성자의 멤버변수에 접근
# init에 oil이라는 인자를 전달하여 부모생성자의 내용을 수행함
def __init__(self, oil, battery):
super().__init__(oil)
self.battery=battery
def charge(self, battery):
# 0이하의 충전은 진행하지 않음
if battery <= 0:
return
self.battery+=battery
# 충전 후 최대 충전량 초과상태라면,
# 현재 충전량을 최대충전량으로 설정
if self.battery > Hybrid.max_battery:
self.battery=Hybrid.max_battery
# 현재 주유 상태와 충전 상태를 나타내는 메서드
def hybrid_info(self):
print("현재 주유상태: {}".format(self.oil), end=" ")
print("현재 충전상태: {}".format(self.battery))
car=Hybrid(0, 0)
car.addOil(100)
car.charge(50)
car.hybrid_info()
실행 결과는 아래와 같다.
추가로 클래스에 대한 내용을 조금 더 자세히 확인하고 싶다면 아래의 링크를 통해 파악할 수 있다.
http://www.tcpschool.com/python2018/python_class_object
'Python' 카테고리의 다른 글
[아나콘다] 데이터 분석 및 가공 (0) | 2022.05.10 |
---|---|
[IDLE] 데이터 분석 및 가공 (0) | 2022.05.10 |
[IDLE] 파일 입출력 (0) | 2022.05.04 |
[IDLE] 예제와 중복제거 (0) | 2022.05.03 |
[IDLE 설치] 파이썬 입문 (0) | 2022.05.02 |