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 정의 인터페이스 와 추상 류 에 관 한 자 료 는 우리 의 다른 관련 글 에 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.