728x90
클래스¶
In [2]:
#클래스를 사용하는 이유
champion1_name = '이즈리얼'
champion1_health = 700
champion1_attack = 90
print(f"{champion1_name}님 소환사의 협곡에 오신것을 환영합니다.")
champion2_name = '리신'
champion2_health = 800
champion2_attack = 95
print(f"{champion2_name}님 소환사의 협곡에 오신것을 환영합니다.")
def basic_attack(name, attack):
print(f"{name} 기본공격 {attack}")
basic_attack(champion1_name,champion1_attack)
basic_attack(champion2_name,champion2_attack)
print("=================클래스를 사용하는 경우 ===================")
class Champion:
def __init__(self, name, health, attack):
self.name = name
self.health = health
self.attack = attack
print(f"{name}님 소환사의 협곡에 오신것을 환영합니다.")
def basic_attack(self):
print(f"{self.name} 기본공격 {self.attack}")
ezreal = Champion("이즈리얼",700,90)
leesin = Champion("리신",800,95)
ezreal.basic_attack()
leesin.basic_attack()
#클래스를 활용하면 챔피언 추가할때 훨씬 간편하다
이즈리얼님 소환사의 협곡에 오신것을 환영합니다.
리신님 소환사의 협곡에 오신것을 환영합니다.
이즈리얼 기본공격 90
리신 기본공격 95
=================클래스를 사용하는 경우 ===================
이즈리얼님 소환사의 협곡에 오신것을 환영합니다.
리신님 소환사의 협곡에 오신것을 환영합니다.
이즈리얼 기본공격 90
리신 기본공격 95
In [5]:
class Monster:
def say(self):
print("나는 몬스터다!")
goblin = Monster()
goblin.say()
#파이썬에서는 자료형도 클래스다
a = 10
b = "문자열객체"
c = True
print(type(a))
print(type(b))
print(type(c))
print(b.__dir__()) #문자열 객체에서 사용할 수 있는 메서드
나는 몬스터다!
<class 'int'>
<class 'str'>
<class 'bool'>
['__repr__', '__hash__', '__str__', '__getattribute__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__iter__', '__mod__', '__rmod__', '__len__', '__getitem__', '__add__', '__mul__', '__rmul__', '__contains__', '__new__', 'encode', 'replace', 'split', 'rsplit', 'join', 'capitalize', 'casefold', 'title', 'center', 'count', 'expandtabs', 'find', 'partition', 'index', 'ljust', 'lower', 'lstrip', 'rfind', 'rindex', 'rjust', 'rstrip', 'rpartition', 'splitlines', 'strip', 'swapcase', 'translate', 'upper', 'startswith', 'endswith', 'removeprefix', 'removesuffix', 'isascii', 'islower', 'isupper', 'istitle', 'isspace', 'isdecimal', 'isdigit', 'isnumeric', 'isalpha', 'isalnum', 'isidentifier', 'isprintable', 'zfill', 'format', 'format_map', '__format__', 'maketrans', '__sizeof__', '__getnewargs__', '__doc__', '__setattr__', '__delattr__', '__init__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__dir__', '__class__']
생성자¶
인스턴스를 만들 때 호출되는 메서드¶
In [12]:
#클래스, 메서드 생성
class Monster:
#클래스 속성 생성
def __init__(self,health,attack,speed): # __init__메서드는 인스턴스를 만들때 호출되는 메서드
self.health = health #self는 자기 자신을 뜻하며, 메서드 만들 때 넣어줘야함
self.attack = attack
self.speed = speed
#메서드 생성
def decrease_health(self,num):
self.health -= num
def get_health(self):
return self.health
#고블린 인스턴스 생성
goblin = Monster(800,120,300)
goblin.decrease_health(100) # 800 - 100
print(goblin.get_health()) # 체력 출력
#늑대 인스터스 생성
wolf = Monster(1500,200,350)
wolf.decrease_health(1000)
print(wolf.get_health())
700
500
상속¶
자식클래스가 부모클래스의 (속성)(메서드)를 가져올 수 있다¶
클래스들에 중복된 코드를 제거하고 유지보수를 편하게 하기 위해서 사용¶
In [13]:
##부모클래스 정의
class Monster:
def __init__(self, name,health,attack): #속성
self.name=name
self.health = health
self.attack = attack
def move(self): #메서드
print("지상에서 이동하기")
오버라이딩 : 부모가 정의했던 메서드 재정의¶
In [16]:
##자식클래스 정의
#class 자식 클래스 이름(부모 클래스 이름)
class Wolf(Monster):
pass #코드 블록부분 굳이 만들지 않을 때
class Shark(Monster):
def move(self): #오버라이딩 : 부모가 정의했던 메서드 재정의
print("헤엄치기")
class Dragon(Monster):
def move(self):
print("날기")
wolf = Wolf("울프",1500,200)
wolf.move()
shark = Shark("샤크",3000,400)
shark.move()
dragon = Dragon("드래곤",8000,800)
dragon.move()
지상에서 이동하기
헤엄치기
날기
In [35]:
import random
class Dragon(Monster):
#생성자 오버라이딩
def __init__(self, name, health, attack):
super().__init__(name,health,attack) #부모클래스 생성자 호출
self.skills = ("불뿜기","꼬리치기","날개치기")
def move(self):
print("날기")
def skill(self):
print(f"[{self.name}] 스킬 사용 {self.skills[random.randint(0,2)]}")
dragon = Dragon("드래곤",8000,800)
dragon.move()
dragon.skill()
날기
[드래곤] 스킬 사용 불뿜기
In [37]:
class Monster:
max_num = 1000 #클래스변수
def __init__(self, name,health,attack): #속성
self.name=name
self.health = health
self.attack = attack
Monster.max_num -=1
def move(self): #메서드
print("지상에서 이동하기")
In [45]:
import random
class Wolf(Monster):
pass #코드 블록부분 굳이 만들지 않을 때
class Shark(Monster):
def move(self): #오버라이딩 : 부모가 정의했던 메서드 재정의
print("헤엄치기")
class Dragon(Monster):
#생성자 오버라이딩
def __init__(self, name, health, attack):
super().__init__(name,health,attack) #부모클래스 생성자 호출
self.skills = ("불뿜기","꼬리치기","날개치기")
def move(self):
print("날기")
def skill(self):
print(f"[{self.name}] 스킬 사용 {self.skills[random.randint(0,2)]}")
wolf = Wolf("울프",1500,200)
wolf.move()
print(wolf.max_num) #클래스 변수
shark = Shark("샤크",3000,400)
shark.move()
print(shark.max_num) #클래스 변수
dragon = Dragon("드래곤",8000,800)
dragon.move()
print(dragon.max_num) #클래스 변수
지상에서 이동하기
987
헤엄치기
986
날기
985
실습문제 8.1.1
영철은 스타트게임즈 회사에 개발자로 취직을 하게 되었다.
지난주 회의 결과로 신작 MMORPG 게임의 아이템 구성안을 만들었다.
아이템 공통 : 이름, 가격, 무게, 판매하기, 버리기
장비 아이템 : 착용효과, 착용하기
소모품 아이템 : 사용효과, 사용하기
그리고 구성안을 토대로 클래스 다이어그램을 설계하였다.
구성안과 설계도를 보고 클래스를 코드로 완성해보자.
(메서드 구현은 자유롭게 한다)
In [67]:
class Item:
def __init__(self,name,price,weight,isdropable):
self.name = name
self.price = price
self.weight = weight
self.isdropable = isdropable
def sale(self):
print(f"[{self.name}]을 [{self.price}]에 판매했습니다")
def discard(self):
if self.isdropable:
print(f"[{self.name}]을 버렸습니다")
else:
print(f"[{self.name}]을 버릴 수 없습니다")
class WearableItem(Item):
def __init__(self,name,price,weight,isdropable,effect):
super().__init__(name,price,weight,isdropable) #self 안써도됨
self.effect = effect
def wear(self):
print(f"[{self.name}]을 착용했습니다. {self.effect}")
class UsableItem(Item):
def __init__(self,name,price,weight,isdropable,effect):
super().__init__(name,price,weight,isdropable)
self.effect = effect
def use(self):
print(f"[{self.name}]을 사용했습니다. {self.effect}")
#인스턴스 생성
sword = WearableItem("이가닌자의검",30000,3.5,True,"체력 5000증가")
sword.wear()
sword.sale()
sword.discard()
potion = UsableItem("빨간물약",500,0.1,False,"체력 50회복")
potion.discard()
potion.sale()
potion.use()
[이가닌자의검]을 착용했습니다. 체력 5000증가
[이가닌자의검]을 [30000]에 판매했습니다
[이가닌자의검]을 버렸습니다
[빨간물약]을 버릴 수 없습니다
[빨간물약]을 [500]에 판매했습니다
[빨간물약]을 사용했습니다. 체력 50회복
'Python > 문법' 카테고리의 다른 글
파이썬 - 클래스/모듈 (0) | 2021.12.30 |
---|---|
파이썬 - 함수 (0) | 2021.12.30 |
파이썬 - 입력과 출력 (0) | 2021.12.29 |
파이썬 For if while 자세히 (0) | 2021.12.29 |
파이썬 - 변수, 자료구조 (0) | 2021.12.28 |
댓글