[Fluent Python] study week 4

Cha Hwa Young·2025년 2월 7일
0

CH 13. 인터페이스, 프로토콜, 추상 베이스 클래스

구현이 아니라 인터페이스에 맞게 프로그래밍하라.
-감마, 헬름, 존슨, 블리시디스
객체지향 설계의 첫 번째 원칙

파이썬이 지원하는 네 가지 타이핑

1) 덕 타이핑 : 초기 파이썬에서부터 기본적으로 적용된 기법
2) 구스 타이핑(goose typing) : 추상 베이스 클래스(ABC)에서 지원하는 타이핑, 객체가 ABC 형인지 런타임에 검사하는 것
3) 정적 타이핑 (static typing) : C나 자바처럼 정적으로 타입을 검사, 파이썬 버전 3.5부터 typing 모듈과 함께 PEP 484 - 자료형 힌트를 따르는 외부 자료형 검사기로 검사
4) 정적 덕 타이핑 : 파이썬 3.8에서 typing.Protocol의 서브클래스를 통해 지원하며 외부 자료형 검사기가 필요

두 가지 프로토콜

  • 프로토콜 : HTTP 등의 네트워크 프로토콜은 GET, PUT, HEAD 등과 같이 클라이언트가 서버에 내릴 수 있는 명령을 명시
  • 비공식 인터페이스 : 네트워크 프로그래밍에 대한 부분 제외. 파이썬 문서에서 프로토콜이라는 용어는 대부분 비공식 인터페이스 의미

동적 프로토콜과 정적 프로토콜

  • 동적 프로토콜 : 늘 사용해 온 비공식 프로토콜. 암묵적, 관례적. 인터프리터 자체에서 지원. 정적 자료형 검사기 검증 X
  • 정적 프로토콜 : typing.Protocol의 서브클래스. 프로그램에 필요하지 않더라도 프로토콜 클래스에 선언된 메서드를 객체가 모두 제공해야 한다.

두 프로토콜 모두 클래스가 상속 등을 통해 프로토콜 지원함 선언 필요 X

덕 타이핑

구스 타이핑

정적 프로토콜

파이썬 오래 쓰신 분들은 mypy를 싫어하신다고 함. -

CH 14. 상속: 득과 실

super()

  • 서브클래스가 슈퍼클래스의 메서드를 오버라이드 할 때,
    오버라이드한 메서드가 슈퍼클래스의 해당 메서드를 호출할 필요 O
class LastUpdatedOrderDict(OrderedDict):
    def __setitem__(self, key, value):
        super().__setitem__(key, value)
        self.move_to_end(key)

__settiem__() 오버라이드

  • 슈퍼클래스에 정의된 super().__setitem__ 호출 -> *key-value 쌍을 추가 or 갱신

  • self.move_to_end() 호출 -> 갱신된 키 항목이 마지막 항목이 되도록

class NotRecommend(OrderedDict):
    def __setitem__(self, key, value):
        OrderedDict.__setitem__(self, key, value)
        self.move_to_end(key)

❌❌ 위 코드는 권장하지 않음.

  • 베이스 클래스 하드코딩 =>OrderedDict가 class문에도 나오고 메서드 안에서도 등장. 이렇게 되면 다른 사람이 class 문 수정할 때 __setitem__ 수정하지 않으면 버그 발생
  • super()는 다중 상속에서의 클래스 계층구조를 처리

super()의 두 인수

  • type : 원하는 메서드를 구현하는 슈퍼클래스 검색 경로의 시작, 기본값으로 super()를 호출한 메서드를 소유한 클래스
  • object_or_type : 인스턴스 메서드 호출 시에는 인스턴스, 클래스 메서드 호출 시에는 클래스가 수신자가 된다.
    기본적으로 인스턴스 메서드 안에서 호출하면 수신자 => self

내장형 상속의 문제점

MRO

FYI: C3 선형화 알고리즘
자식 클래스가 부모보다 먼저 탐색
부모 클래스의 순서를 유지
중복된 클래스는 한 번만 탐색

ping은 밑에서부터 A, B, root로 가고

profile
기회를 잡는 사람이 되도록!

0개의 댓글