Python 은 인터페이스 와 추상 류 를 어떻게 정의 합 니까?

문제.
인터페이스 나 추상 류 를 정의 하고 유형 검 사 를 통 해 하위 클래스 가 특정한 방법 을 실현 하도록 확보 하고 싶 습 니 다.
해결 방안abc모듈 을 사용 하면 추상 적 인 기본 클래스 를 쉽게 정의 할 수 있 습 니 다.

from abc import ABCMeta, abstractmethod

class IStream(metaclass=ABCMeta):
  @abstractmethod
  def read(self, maxbytes=-1):
    pass

  @abstractmethod
  def write(self, data):
    pass
추상 류 의 특징 중 하 나 는 그것 이 직접적 으로 예화 되 지 못 한 다 는 것 이다.예 를 들 어 다음 과 같이 하면 안 된다 고 상상 하 는 것 이다.

a = IStream() # TypeError: Can't instantiate abstract class
        # IStream with abstract methods read, write
추상 류 의 목적 은 다른 류 로 하여 금 그것 을 계승 하고 특정한 추상 적 인 방법 을 실현 하 게 하 는 것 이다.

class SocketStream(IStream):
  def read(self, maxbytes=-1):
    pass

  def write(self, data):
    pass
추상 적 인 기본 클래스 의 주요 용 도 는 코드 에서 특정한 유형 이 있 는 지 확인 하고 특정한 인 터 페 이 스 를 실현 하 는 것 이다.

def serialize(obj, stream):
  if not isinstance(stream, IStream):
    raise TypeError('Expected an IStream')
  pass
이런 방식 을 계승 하 는 것 외 에 등록 방식 을 통 해 특정한 유형 을 추상 적 인 기 류 를 실현 할 수 있다.

import io

# Register the built-in I/O classes as supporting our interface
IStream.register(io.IOBase)

# Open a normal file and type check
f = open('foo.txt')
isinstance(f, IStream) # Returns True
@abstractmethod정적 방법,유형 방법 과properties도 주해 할 수 있다.너 는 이 주해 가 함수 정의 에 바짝 붙 어 있다 는 것 만 보증 하면 된다.

class A(metaclass=ABCMeta):
  @property
  @abstractmethod
  def name(self):
    pass

  @name.setter
  @abstractmethod
  def name(self, value):
    pass

  @classmethod
  @abstractmethod
  def method1(cls):
    pass

  @staticmethod
  @abstractmethod
  def method2():
    pass
토론 하 다.
표준 라 이브 러 리 에는 추상 적 인 기본 클래스 를 사용 하 는 곳 이 많다.4567914)모듈 은 용기 와 교체 기(서열,맵,집합 등)와 관련 된 추상 적 인 기 류 를 많이 정의 했다.collections라 이브 러 리 는 디지털 대상(정수,부동 소수점,유리수 등)과 관련 된 기 류 를 정의 했다.numbers라 이브 러 리 는 I/O 작업 과 관련 된 기본 클래스 를 많이 정의 했다.
미리 정 의 된 추상 클래스 를 사용 하여 더 일반적인 유형 검 사 를 수행 할 수 있 습 니 다.예 를 들 어:

import collections

# Check if x is a sequence
if isinstance(x, collections.Sequence):
...

# Check if x is iterable
if isinstance(x, collections.Iterable):
...

# Check if x has a size
if isinstance(x, collections.Sized):
...

# Check if x is a mapping
if isinstance(x, collections.Mapping):
비록 ABC s 는 우리 로 하여 금 유형 검 사 를 편리 하 게 할 수 있 지만,우 리 는 코드 에서 그것 을 너무 많이 사용 하지 않 는 것 이 좋 습 니 다.Python 의 본질은 동적 프로 그래 밍 언어 이기 때문에 그 목적 은 당신 에 게 더 많은 유연성 을 주 고 유형 검 사 를 강제 하거나 코드 를 더욱 복잡 하 게 만 드 는 것 입 니 다.이렇게 하 는 것 은 근본 을 버 리 고 끝 을 추구 하 는 것 과 다 름 없습니다.
이상 은 Python 이 인터페이스 와 추상 류 를 어떻게 정의 하 는 지 에 대한 상세 한 내용 입 니 다.Python 정의 인터페이스 와 추상 류 에 관 한 자 료 는 우리 의 다른 관련 글 에 주목 하 십시오!

좋은 웹페이지 즐겨찾기