Python ABC-1
Python ABC
abc의 역할
직접 class를 상속받지 않고도
isinstance, issubclass를 통해 subclass로 인지되는
가상 subclass를 만들 수 있게한다.
Python의 Abstract base class는
hasattr , magic method와 같은 방법보다
인터페이스를 정의함으로서 duck-typing을 보완한다.
isinstance(x, collections.Iterable)이
hasattr()나 그에 동등한 로직의 try...except 블록의 코드보다 더 이해하기 쉽다.
(의도가 명확하다.)
즉, a라는 클래스가 A라는 상위 클래스의 인터페이스를 알맞게 구현하기만 한다면
a는 A의 subclass이다.
abstract class/ 추상 클래스
세부 구현이 누락된 Class
세부 구현이 누락된 Class
concrete class/ 구상 클래스
완전한 속성과 메서드가 구현된 Class
Open-closed principle
SOLID원칙 중 Open-closed 원칙을 만족한다.
Open-closed원칙을 지키지 않은 코드는
<Open-closed principal>
기능을 추가할 때마다 기존 코드의 변경이 발생한다.
- 새로운 class나 기능의 확장에 대해서는 열려있고
- 수정에 대해서는 폐쇄적이어야한다.
개방-폐쇄 원칙을 준수하는 코드는
객체지향의 장점인 다형성과 확장성을 만족한다.
잘 활용한다면 새로운 변경사항에 대해 유연하며
유지보수 비용 감소의 장점으로 이어진다.
Polymorphic Open-closed principle
1990년경 Bertrand Meyer가 작성한 개방-폐쇄 원칙은
추상 인터페이스(abstracted interfaces)를 참조하기 위해 재정의되었다.
abstract base class로부터 상속을 권고한다.
인터페이스 스펙은 상속을 통해 재사용될 수 있지만
재구현까지는 할 필요가 없다.
기존 인터페이스는 수정에 대해, 그리고 새 구현에 대해 폐쇄돼있으며
최소한의 abstracted 인터페이스를 구현해야한다.
abc가 적용된 모듈 예
- collections.abc
- numbers
- streams (io module)
- importlib.abc
duck-typing
어떤 객체가 적합한 인터페이스인지 확인할 때,
객체의 Type을 검사해서 확인하는 대신에
method나 attriburte를 호출해서 확인하는 프로그래밍 스타일.
Type보다 Interface를 중시하며
Python ABC class가 이를 만족하는 설계를 가지고있다.
테스트 할 때, type() , isinstance() 대신
hasattr 테스트나 EAFP를 사용한다.
type(), isinstsance()의 검사 문제는 abc에서 보완한다.
"오리처럼 걷고, 헤엄치고, 꽥꽥거리는 새를 보면 그 새를 오리라고 부른다"
https://en.wikipedia.org/wiki/Open%E2%80%93closed_principle
https://docs.python.org/3/library/abc.html#module-abc
댓글
댓글 쓰기