728x90
다형성을 알아보자!
어떠한 기능이나 함수를 나타내는 것이 아니라 표현의 방법이다!
하나의 이름으로 다양한 형태를 표현할 수 있는 특성
- 개, 고양이, 사자, 물개, 곰, 독수리, 뱀, 매미, 호랑이, 펭귄 등등
- 위의 모든것은 동물이다
- 일반화(상속을 통한 표현 )
- 추상화(공통적인 특성을 선언 -> 동물은 숨을 쉰다, 움직인다 등등)
- 다형성(공통적인 특성을 각 클래스의 특성이 맞게 재정의 -> 아가미 호흡, 폐호흡, 고양이처럼 움직인다 등등)
- 일반화 이름을 사용하여 재정의된 함수들을 호출(동적 바인딩)
# 일자 상속 개념
class 동물:
def 먹는다(self):
pass
def 움직인다(self):
pass
def 호흡한다(self):
pass
def 소리낸다(self):
pass
class 포유류(동물):
def 호흡한다(self):
print('폐 호흡')
class 어류(동물):
def 호흡한다(self):
print('아가미 호흡')
class 개(포유류):
def 먹는다(self):
print('개같이 먹는다.')
def 움직인다(self):
print('개같이 움직인다.')
def 소리낸다(self):
print('개같이 소리낸다.')
def 개특징(self):
print('개만 가지는 특징')
class 고양이(포유류):
def 먹는다(self):
print('고양이같이 먹는다.')
def 움직인다(self):
print('고양이같이 움직인다.')
def 소리낸다(self):
print('고양이같이 소리낸다.')
def 고양이특징(self):
print('고양이만 가지는 특징')
class 고래(포유류):
def 먹는다(self):
print('고래같이 먹는다.')
def 움직인다(self):
print('고래같이 움직인다.')
def 소리낸다(self):
print('고래같이 소리낸다.')
def 고래특징(self):
print('고래만 가지는 특징')
class 상어(어류):
def 먹는다(self):
print('상어같이 먹는다.')
def 움직인다(self):
print('상어같이 움직인다.')
def 소리낸다(self):
print('상어같이 소리낸다.')
def 상어특징(self):
print('상어만 가지는 특징')
animals = [고양이(), 개(), 고래(), 상어()]
for a in animals:
a.먹는다()
a.움직인다()
a.소리낸다()
a.호흡한다()
print()
# 실행결과
고양이같이 먹는다.
고양이같이 움직인다.
고양이같이 소리낸다.
폐 호흡
개같이 먹는다.
개같이 움직인다.
개같이 소리낸다.
폐 호흡
고래같이 먹는다.
고래같이 움직인다.
고래같이 소리낸다.
폐 호흡
상어같이 먹는다.
상어같이 움직인다.
상어같이 소리낸다.
아가미 호흡
보기쉽게 한글로 코딩을 했지만 한글 코딩은 지양한다. 이유는 다른 개발자의 언어에서 구동이 정상적으로
이루어 지지 않을 수 있기 때문!(걁겕글롉 과 같이 깨질 수 있다..!)
위 처럼 하나의 명령어로 다양한 클래스를 사용, 명령을 해 동작을 구현할 수 있다.
위는 일자상속의 개념이다! 다중상속의 개념도 알아보자.
# 다중 상속 개념
class 동물:
def 먹는다(self):
pass
def 움직인다(self):
pass
def 호흡한다(self):
pass
def 소리낸다(self):
pass
#공통 특성 정의
class 물에서생활하는동물: # 새로운 특성
def 물에서생활(self):
print('물에서 헤엄친다.')
class 포유류(동물): # 동물 클래스 상속
def 호흡한다(self):
print('폐 호흡')
class 어류(동물): # 동물 클래스 상속
def 호흡한다(self):
print('아가미 호흡')
class 개(포유류): # 동물클래스를 상속한 포유류 클래스 상속
def 먹는다(self):
print('개같이 먹는다.')
def 움직인다(self):
print('개같이 움직인다.')
def 소리낸다(self):
print('개같이 소리낸다.')
def 개특징(self):
print('개만 가지는 특징')
class 고양이(포유류): # 동물클래스를 상속한 포유류 클래스 상속
def 먹는다(self):
print('고양이같이 먹는다.')
def 움직인다(self):
print('고양이같이 움직인다.')
def 소리낸다(self):
print('고양이같이 소리낸다.')
def 고양이특징(self):
print('고양이만 가지는 특징')
class 고래(포유류, 물에서생활하는동물): # 다중상속 2가지를 상속받는다.
def __init__(self, n):
self.n = n
def 먹는다(self):
print(id(self.n), '고래같이 먹는다.')
def 움직인다(self):
print(id(self.n), '고래같이 움직인다.')
def 소리낸다(self):
print(id(self.n), '고래같이 소리낸다.')
def 고래특징(self):
print(id(self.n), '고래만 가지는 특징')
def 물에서생활(self):
super().물에서생활() # 부모클래스 명시
print(id(self.n), '호흡하러 수면위로 다닌다.')
class 상어(어류, 물에서생활하는동물): # 다중상속
def 먹는다(self):
print('상어같이 먹는다.')
def 움직인다(self):
print('상어같이 움직인다.')
def 소리낸다(self):
print('상어같이 소리낸다.')
def 상어특징(self):
print('상어만 가지는 특징')
animals = [고래(111), 상어(), 고래(222), 고양이()] # 고래 상어 고래 고양이만 출력
for a in animals:
a.먹는다()
a.소리낸다()
a.움직인다()
a.호흡한다()
a.물에서생활() # 속성 에러!
print()
#실행 결과
1437107162800 고래같이 먹는다.
1437107162800 고래같이 소리낸다.
1437107162800 고래같이 움직인다.
폐 호흡
물에서 헤엄친다.
1437107162800 호흡하러 수면위로 다닌다.
상어같이 먹는다.
상어같이 소리낸다.
상어같이 움직인다.
아가미 호흡
물에서 헤엄친다.
1437107166352 고래같이 먹는다.
1437107166352 고래같이 소리낸다.
1437107166352 고래같이 움직인다.
폐 호흡
물에서 헤엄친다.
1437107166352 호흡하러 수면위로 다닌다.
고양이같이 먹는다.
고양이같이 소리낸다.
고양이같이 움직인다.
폐 호흡
Traceback (most recent call last):
File "c:\Python\PYWORK\10월\10_6_성적처리.py\inheritance10_animal02.py", line 78, in <module>
a.물에서생활() # 속성 에러!
AttributeError: '고양이' object has no attribute '물에서생활'
PS C:\Python\PYWORK>
위 코드를 실행하면
에러가 발생한다. 해석해보면 "고양이" 에 "물에서생활"이 없다!
상속받지 않았는데 기능을 하려고 해서 에러가 났다! (받은게 없는 고양이는 억울하다..!)
클래스를 이용한 다형성표현법을 알아 보앗다!
728x90
'Python 파이썬' 카테고리의 다른 글
예외처리(Exception) (0) | 2023.10.24 |
---|---|
클래스의 관계 표현, object 클래스 (0) | 2023.10.24 |
상속, super (0) | 2023.10.24 |
세터,게터 (Setter, Getter) (0) | 2023.10.23 |
클래스(Class)를 응용해 기능을 구현해보자 (0) | 2023.10.23 |