이번 포스팅에서는 파이썬에서 클래스를 정의하는 방법과 클래스 상속에 대해 알아보겠습니다.
이해를 위해 이전 포스팅을 보는 것을 추천드립니다.
def __init__으로 클래스의 생성자 정의하기
파이썬에서 클래스의 생성자는 다음과 같은 방법으로 지정할 수 있습니다.
class Unit:
def __init__(self, name, hp, damage):
self.name = name
self.hp = hp
self.damage = damage
print("{} 유닛이 생성되었습니다. hp: {} / 공격력: {}".format(self.name, self.hp, self.damage))
파이썬에서 클래스는 def __init__(self)를 통해 생성자를 초기화할 수 있습니다.
클래스를 호출할 때 __init__ 안에 있는 내용들이 발동한다.
if __name__ == "__main__": 을 사용하여 호출하면
class Unit:
def __init__(self, name, hp, damage):
self.name = name
self.hp = hp
self.damage = damage
print("{} 유닛이 생성되었습니다. hp: {} / 공격력: {}".format(self.name, self.hp, self.damage))
if __name__ == "__main__":
marine1 = Unit("해병", 45, 5)
다음과 같은 결과를 출력한다.
또한 초기화된 생성자는 밖에서도 다음과 같이 사용할 수 있다
클래스 인스턴스를 사용하여 멤버변수를 클래스 밖에서 사용하기
class Unit:
def __init__(self, name, hp, damage):
self.name = name
self.hp = hp
self.damage = damage
print("{} 유닛이 생성되었습니다. hp: {} / 공격력: {}".format(self.name, self.hp, self.damage))
if __name__ == "__main__":
marine1 = Unit("해병", 45, 5)
# 초기화된 클래스의 생성자는 다음과 같이 사용할 수 있다.
print("유닛 이름: {}".format(marine1.name))
print("유닛 체력: {}".format(marine1.hp))
print("유닛 공격력: {}".format(marine1.damage))
클래스 확장하기
클래스에 . 붙이는 것만으로도 해당 인스턴스에 값을 추가할 수 있습니다.
class Unit:
def __init__(self, name, hp, damage):
self.name = name
self.hp = hp
self.damage = damage
print("{} 유닛이 생성되었습니다. hp: {} / 공격력: {}".format(self.name, self.hp, self.damage))
if __name__ == "__main__":
marine1 = Unit("해병", 45, 5)
# 초기화된 클래스의 생성자는 다음과 같이 사용할 수 있다.
print("유닛 이름: {}".format(marine1.name))
print("유닛 체력: {}".format(marine1.hp))
print("유닛 공격력: {}".format(marine1.damage))
# marine1 인스턴스에 동적 변수 추가
marine1.dead = True
def custom_ability():
print("임으로 추가된 유닛의 기능")
# marine1 인스턴스에 동적 함수 추가
marine1.custom_ability = custom_ability
if marine1.dead:
print("{} 유닛이 죽었습니다".format(marine1.name))
marine1.custom_ability()
메서드 사용하기
파이썬에서 메서드에 self를 사용하면 해당 클래스에서 정의한 생성자 값을 전부 사용할 수 있게 된다.
class Unit:
def __init__(self, name, hp, damage):
self.name = name
self.hp = hp
self.damage = damage
print("{} 유닛이 생성되었습니다. hp: {} / 공격력: {}".format(self.name, self.hp, self.damage))
# self를 매개변수로 받는 함수
def attack(self, location):
# 클래스의 생성자를 참조해서 사용할 수 있다
print("{}이(가) {} 방향으로 적을 공격합니다.".format(self.name, location))
if __name__ == "__main__":
marine1 = Unit("해병", 45, 5)
# marine1 인스턴스에 동적 변수 추가
marine1.dead = True
marine1.attack("5시")
출력하면 다음과 같은 결과가 나온다
파이썬 클래스에서 def __call__() 의미
예를 들면 다음과 같은 클래스가 있습니다.
class DataProcessor:
def __call__(self, inputs: dict):
name = inputs.get('name', 'Unknown')
age = inputs.get('age', 0)
return f"처리된 데이터: 이름 - {name}, 나이 - {age}"
파이썬 클래스에서 __call__ 메서드는 다음과 같은 역할을 합니다.
클래스의 인스턴스를 함수처럼 호출해서 사용할 수 있습니다.
예를 들면 위 코드는 다음과 같이 사용할 수 있습니다.
# DataProcessor 클래스로 인스턴스 생성
processor = DataProcessor()
# processor 변수에 직접 파라미터 입력 가능
result = processor({'name': '김철수', 'age': 30})
# 처리된 데이터: 이름 - 김철수, 나이 - 30
print(result)
클래스 상속
파이썬에서 클래스 상속은 다음과 같은 형태로 할 수 있다.
class 부모클래스:
# 부모 클래스의 속성과 메서드 정의
class 자식클래스(부모클래스):
# 자식 클래스의 속성과 메서드 정의
부모클래스를 2개 이상 지정하여 2개 이상의 클래스에서 상속을 받을 수도 있다.
class 부모클래스1:
# 부모 클래스의 속성과 메서드 정의
class 부모클래스2:
# 부모 클래스의 속성과 메서드 정의
class 자식클래스(부모클래스1, 부모클래스2):
# 자식 클래스의 속성과 메서드 정의
예를 들면 다음과 같이 쓸 수 있습니다.
class Unit:
def __init__(self, name, hp, damage):
self.name = name
self.hp = hp
self.damage = damage
print("{} 유닛이 생성되었습니다. hp: {} / 공격력: {}".format(self.name, self.hp, self.damage))
# self를 매개변수로 받는 함수
def attack(self, location):
# 클래스의 생성자를 참조해서 사용할 수 있다
print("{}이(가) {} 방향으로 적을 공격합니다.".format(self.name, location))
# Unit 클래스를 상속한 클래스 생성
class AttackUnit(Unit):
def __init__(self, name, hp, damage):
# 부모 클래스(Unit)에 정의한 메서드를 그대로 사용하고 싶으면 여기서도 초기화를 해줘야한다.
# 그렇기 때문에 부모 클래스의 init 부분이 호출됨
Unit.__init__(self, name, hp, damage)
# super()를 사용하면 부모 클래스에 있는 메서드를 사용할 수 있다.
super().attack("5시")
if __name__ == "__main__":
marine1 = AttackUnit("해병", 45, 5)
marine1.attack("8시")
다른 참고하면 좋은 포스팅
'파이썬(Python) > 파이썬 지식' 카테고리의 다른 글
파이썬에서 예외 처리 하기 try ~ except (0) | 2023.11.18 |
---|---|
파이썬에서 메서드(함수) 오버라이드(override) (0) | 2023.11.15 |
파이썬의 모듈에 대한 모든 것 feat. __name__?, __init__? (1) | 2023.11.02 |
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
댓글