파이썬에서 다형성(polymorphism)이란 무엇인가?
다형성이란 객체의 속성이나 기능이 상황에 따라 여러가지 형태를 가질 수 있음을 의미합니다. 중복되는 코드의 양을 줄여서 프로그램 유지보수를 용이하게 합니다. 대표적으로 오버라이딩이 있습니다.
*오버로딩은 파이썬에서 지원하지 않습니다. 구현이 매우매우매우 까다롭습니다.
파이썬에서 다중 상속(multiple inheritance)이 지원되는가?
네. 자식 클래스에서 상속받고자하는 기반/부모 클래스를 기존 상속과 똑같이 인자부분에 컴마로 구분해서 넣어주면 여러개의 클래스를 상속받을 수 있습니다.
다중 상속을 할 때는 상속하고자하는 클래스에 중복되는 메소드가 있을 수 있으므로 다이아몬드 문제가 발생할 수 있으므로 실행하고자하는 메소드가 있는 클래스를 파악하여 상속 순서를 잘 설정하는 것이 필요하며 일반적으로 다른 프로그래밍 언어에서는 이런 문제때문에 다중 상속을 지원하지 않습니다.
다중 상속의 문제점 💎
이미 같은 클래스(가)를 상속받은 두 개의 클래스(나,다)를 다시 어떤 클래스(라)가 상속받는다고 했을 때,
나, 다 클래스가 가 클래스를 각각 상속받아서 서로 다르게 오버라이드 했을 수 있고, 혹은 오버라이드하지 않았더라도 똑같은 클래스를 상속받았다면 중복 상속받게 된다.
이 때 시스템은 동일한 이름의 메소드 중 어떤 메소드를 호출해야하는지 알지 못해 오류를 발생시킨다.
- 다중상속을 지원하는 언어: 파이썬, C++
- 지원하지 않는 언어: Java, C#
다중상속을 지원하지 않는 경우 인터페이스를 사용이때 어떤 메소드가 호출될 것인지 결정하는 것을 method resolution이라고 하고 그 순서를 __mro__에서 정의한다. (이 부분을 보면 메서드를 찾는 순서를 알 수 있다)
이 순서는 C3선형화 알고리즘에 의해 정의된다.
다단계 상속 Multilevel Inheritance
가-나-다 클래스가 있을 때 가는 나의 베이스 클래스, 나는 다의 베이스 클래스가 되어 단계적으로 하나씩 상속을 받음
The use of the else clause is better than adding additional code to the try clause because it avoids accidentally catching an exception that wasn’t raised by the code being protected by the try … except statement.
여러개의 오류 처리하기/회피하기
try... except 오류1 except 오류2 ...
try... except (오류1, 오류2)
except에 스스로 정의한 에러를 넣고 싶고, 그 문구를 프린트하고 싶은 경우 스스로 정의한 에러 클래스 안에 __str__(self) 메서드를 구현해서 return 에 문구를 적어줘야함
class MyError(Exception): # Exception 클래스를 상속받아 에러를 생성
def __str__(self):
return "허용되지 않는 별명입니다." # e에서 프린트하고자 하는 문구
def say_nick(nick):
if nick == '바보':
raise MyError()
print(nick)
try:
say_nick("천사")
say_nick("바보")
except MyError as e:
print(e)
https://wikidocs.net/30#try-except
finally 이하의 절은 try 수행도중 예외 발생 여부와 상관없이 항상 수행된다. 보통 사용했던 리소스(ex.파일)를 클로즈해야할 때 많이 사용한다.
처음에 인덱스의 순서가 증가하기만 하면 된다고 생각하고 코드를 짰는데 그래서 계속 마지막 한 문제를 틀렸다.
카드를 사용하지 않고 다음 카드로 넘어갈 수 없습니다 == 무조건 인덱스가 1씩 증가함
을 의미해서 각 카드안에서는 사용되는 카드의 인덱스가 1씩만 차이날 수있다.
def solution(cards1, cards2, goal):
cards1.append('ㅁ')
cards2.append('ㅁ')
for i in goal:
if i == cards1[0]:
cards1.pop(0)
elif i == cards2[0]:
cards2.pop(0)
else: return "No"
return "Yes"
계속 리스트의 첫번째 요소랑만 비교하면 되니까 goal의 요소i를 제외하고는 다른 변수는 필요가 없었다.
리스트.pop(인덱스)를 잘 활용한 것 같다