Python 14 - 메소드(method), 상속, 다중상속

2021. 5. 6. 19:16python

반응형

# 메소드 (method) _ feat.Starcraft

class Unit:
	def __init__(self, name, hp, damage):
		self.name = name
		self.hp = hp
		self.damage = damage
		print("{0} 유닛이 생성 되었습니다." .format(self.name))
		print("체력 {0}, 공격력 {1}" .format(self.hp, self.damage))



# 공격 유닛
class AttackUnit:
	def __init__(self, name, hp, damage):
		self.name = name
		self.hp = hp
		self.damage = damage
		print("{0} 유닛이 생성 되었습니다." .format(self.name))
		print("체력 {0}, 공격력 {1}" .format(self.hp, self.damage))


	def attack(self, location):
		print("{0} : {1} 방향으로 적군을 공격합니다." .format( self.name, location, self.damage))


	def damaged(self, damage):
		print("{0} : {1} 데미지를 입었습니다." .format(self.name, damage))
		self.hp -= damage
		print("{0} : 현재 체력은 {1} 입니다." .format(self.name, self.hp))
		if self.hp <= 0:
			print("{0} : 파괴되었습니다." .format(self.name))



# 파이어뱃 공격유닛 화염방사기
firebat1 = AttackUnit("파이어뱃", 50, 16)
firebat1.attack("5시")


firebat1.damaged(25)
firebat1.damaged(25)

------------------아래와 같이 출력------------------

파이어뱃 유닛이 생성 되었습니다.

체력 50, 공격력 16

파이어뱃 : 5시 방향으로 적군을 공격합니다.

파이어뱃 : 25 데미지를 입었습니다.

파이어뱃 : 현재 체력은 25 입니다.

파이어뱃 : 25 데미지를 입었습니다.

파이어뱃 : 현재 체력은 0 입니다.

파이어뱃 : 파괴되었습니다.

 

# 상속 : 말 그대로 물려 받는 것

class Unit:
	def __init__(self, name, hp):
		self.name = name
		self.hp = hp


# 공격 유닛
class AttackUnit(Unit): #name 과 hp는 위Unit과 동일하므로 상속하기 위해 괄호안에 넣고
	def __init__(self, name, hp, damage):
		Unit.__init__(self, name, hp) #self.name 과 self.hp는 Unit.__init__으로 대체
		self.damage = damage
		print("{0} 유닛이 생성 되었습니다." .format(self.name))
		print("체력 {0}, 공격력 {1}" .format(self.hp, self.damage))

# 다중 상속

# 일반 유닛
class Unit:
	def __init__(self, name, hp):
		self.name = name
		self.hp = hp


# 공격 유닛
class AttackUnit(Unit):
	def __init__(self, name, hp, damage):
	Unit.__init__(self, name, hp)
self.damage = damage
	print("{0} 유닛이 생성 되었습니다." .format(self.name))
	print("체력 {0}, 공격력 {1}" .format(self.hp, self.damage))


def attack(self, location):
	print("{0} : {1} 방향으로 적군을 공격합니다." .format( self.name, location, self.damage))


def damaged(self, damage):
	print("{0} : {1} 데미지를 입었습니다." .format(self.name, damage))
	self.hp -= damage
	print("{0} : 현재 체력은 {1} 입니다." .format(self.name, self.hp))
	if self.hp <= 0:
		print("{0} : 파괴되었습니다." .format(self.name))


# 드랍쉽 : 공중유닛 수송기 공격기능 x
# 날 수 있는 기능을 가진 클래스
class Flyable:
	def __init__(self, flying_speed):
		self.flying_speed = flying_speed


def fly(self, name, location):
	print("{0} : {1} 방향으로 날아갑니다. [속도{2}]" .format( name, location, self.flying_speed))


# 공중 공격 유닛 클래스
class FlyableAttackUnit(AttackUnit, Flyable): #AttackUnit,Flyable두가지를 상속받음
	def __init__(self, name, hp, damage, flying_speed):
		AttackUnit.__init__(self, name, hp, damage) #상속받은 것들은 이렇게 작성
		Flyable.__init__(self, flying_speed) #상속받은 것들은 이렇게 작성


# 발키리 공중 공격 유닛, 한번의 14발 미사일 발사
valkyrie = FlyableAttackUnit("발키리", 200, 6, 5)
valkyrie.fly(valkyrie.name, "3시") # 이 줄에 있는 fly는 위에 작성한 함수중 fly함수를 불러오기 위함이다.

파이썬 클래스 특징 정리

클래스는 객체(인스턴스)를 생성하기 위해 필요하다. (주로 붕어빵틀을 클래스, 붕어빵을 객체로 비유한다)

객체지향 프로그래밍(OOP)을 위해 사용된다.

객체지향 프로그래밍의 특징 - 추상화, 캡슐화(정보은닉), 상속, 다형성, 프로그램의 유지보수를 편리하게 만든다.

파이썬의 모든 데이터는 객체이다. 함수 또한 객체다.

클래스에는 속성(멤버 변수), 메소드(멤버 함수), 생성자, 소멸자 등이 포함된다.

 

클래스 내에 속성 메소드가 포함된다.

클래스에 정의되는 변수를 속성(property), 함수는 메소드(method)라 부른다.

메소드의 첫 번째 인자(argument) 로 self를 전달한다.

self는 하나의 클래스에서 만들 여러 객체(인스턴스)를 구별하기 위해 사용된다.

(다른 이름을 써도 되지만 관습적으로 self를 주로 사용한다.)

 

객체가 만들어질 때 호출되는 함수를 생성자(__init__)라고 한다.

생성자는 객체를 초기화 할 때 자주 사용된다.

객체가 사라질 때 호출되는 함수를 소멸자(__del__)라고 한다.

 

상속 받고 싶은 부모 클래스를 괄호 안에 입력한다.

상속을 받으면 부모 클래스의 모든 내용이 자식에게 전달된다. (코드 재사용)

자식 클래스에서 부모 클래스 메소드를 사용하기 위해 super()를 사용한다.

부모 클래스가 제공하는 메서드를 자식 클래스가 재정의 할 수 있다. (오버라이딩)

파이썬은 다중상속을 지원한다. (콤마로 구분하여 나열하면 된다.)

class robot:
  name = 'robot'
  age = 0
  def __init__(self, name, age):
    print('robot 생성자 호출!')
    self.name = name
    self.age = age
  def __del__(self):
    print('robot 소멸자 호출!')
  def info(self):
    print('나의 이름은', self.name, '입니다!')
    print('나이는', self.age, '입니다!')

class strong_robot(robot):
  weapon = 'gun'
  def __init__(self, name, age, weapon):
    print('strong_robot 생성자 호출!')
    super().__init__(name, age)
    self.weapon = weapon
  def info(self): #오버라이딩
    super().info()
    print(self.weapon, '로 싸웁니다!')
반응형