-인스턴스 속성에 접근할 수 있는 메서드
-항상 첫번째 파라미터로 self를 갖는다.
※ hit 메서드 구현하기
데미지를 받으면 체력과 방어막이 깎이는 hit 메서드를 구현한다.
① 데미지가 방어막보다 작거나 같으면 방어막만 깎인다.
② 데미지가 방어막보다 크고 체력보다 작으면 체력과 방어막이 깎인다.
③ 데미지가 체력보다 크면 체력을 0으로 만든다.
class Unit:
"""
인스턴스 속성 : 이름, 체력, 방어막, 공격력
-> 객체마다 다른 값을 가지는 속성
"""
count = 0
def __init__(self, name, hp, shield, demage):
self.name = name
self.hp = hp
self.shield = shield
self.demage = demage
Unit.count += 1
print(f"[{self.name}](이)가 생성 되었습니다.")
def __str__(self):
return f"[{self.name}] 체력 : {self.hp} 방어막 : {self.shield} 공격력 : {self.demage}"
# 인스턴스 메서드 (내가 만든 메서드)
def Hit(self, Unit):
if self.demage <= Unit.shield: #공격자의 데미지가 상대 유닛의 쉴드보다 작다면
Unit.shield = Unit.shield - self.demage
print(f" {Unit.name} 남은 쉴드: {Unit.shield} 남은 체력 :{Unit.hp}")
elif self.demage > Unit.shield: #공격자의 데미지가 상내 유닛의 쉴드보다 크다면
remainDemage= self.demage - Unit.shield
if remainDemage < Unit.hp: # 남은 데미지가 체력보다 작으면
Unit.hp = Unit.hp - remainDemage
print(f" {Unit.name} 남은 체력 :{Unit.hp}")
else: # 남은 데미지가 체력보다 크다면
Unit.hp = 0
print(f" {Unit.name} 남은 체력 :{Unit.hp} 파괴되었습니다.")
#(강의에서 만든 메서드)
def hit(self,demage):
#방어막 변경
if self.shield >= demage:
self.shield -= demage
demage = 0
else:
demage -= self.shield
self.shield = 0
#체력 변경
if demage > 0:
if self.hp > demage:
self.hp -= demage
else:
self.hp=0
probe = Unit("프로브", 20, 20, 5)
zealot = Unit("질럿", 100, 60, 16)
dragoon = Unit("드라군", 100, 80, 20)
zealot.Hit(probe)
zealot.Hit(probe)
zealot.Hit(probe)
dragoon.hit(20)
print(dragoon)
# 결과
프로브 남은 쉴드: 4 남은 체력 :20
프로브 남은 체력 :8
프로브 남은 체력 :0 파괴되었습니다.
[드라군] 체력 : 100 방어막 : 60 공격력 : 20
내가 만든 메서드는 공격자와 피격자를 적으면 유닛마다 정의된 인스턴스 속성을 활용해서 공격자의 데미지만큼 감소된 피격자의 쉴드와 체력을 보여주는 반면, 강의에서 보여준 메서드는 피격대상과 데미지의 수치를 적으면 피격대상의 체력과 쉴드를 그 데미지만큼 감소하여 리턴을 하는 메서드이다.
-클래스 속성에 접근하기 위해서 사용하낟.
-클래스를 의미하는 cls를 파라미터로 받는다.
class Unit:
count = 0
...
@classmethod
def print_count(cls):
print(f"전체유닛 개수: {cls.count}")
-인스턴스를 만들 필요가 없는 메서드
-self를 받지 않는다.
-메서드가 인스턴스 유무와 관계 없이 독립접으로 사용 될때
class Math:
# 정적 메서드(static method)
# 인스턴스를 만들 필요가 없는 메서드
@staticmethod
def add(x, y):
return x + y
@staticmethod
def sub(x,y):
return x - y
print(Math.add(5,6))
print(Math.sub(10,2))
-클래스안에 정의할 수 있는 스페셜 메서드
-특별한 상황에 호출된다. ex) init
__이름__ 의 형태로 되어있다.
※dir 함수: 객체가 가지고 있는 메서드와 속성을 확인할수 있는 메서드 ex) dir(probe)