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

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

댓글

이 블로그의 인기 게시물

실무진 면접 경험으로 정리하는 백엔드 (1) : 에듀 테크 기업 면접

노마드코더 개발자북클럽 Clean code TIL 6 : 6장. 객체와 자료구조

백엔드 개발자가 Djnago fullstack 사이드 프로젝트를하며 ( html, css, vanillaJS 그리고 JS프레임워크 )