Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python의 추상 기본 클래스(abc)

<시간/>

하나 이상의 추상 메서드가 포함된 클래스를 추상 클래스라고 합니다. 추상 메서드는 선언되었지만 구현을 포함하지 않는 메서드입니다. 추상 클래스는 인스턴스화할 수 없으며 추상 메서드는 하위 클래스에서 구현해야 합니다.

추상 기본 클래스는 hasattr()과 같은 다른 기술이 서투르거나 미묘하게 잘못된 경우(예:매직 메서드의 경우) 인터페이스를 정의하는 방법을 제공합니다. ABC는 클래스에서 상속되지 않지만 여전히 isinstance() 및 issubclass() 함수에 의해 인식되는 클래스인 가상 하위 클래스를 도입합니다. 파이썬에는 많은 내장 ABC가 있습니다. Iterator, Generator, Set, mapping 등과 같은 데이터 구조에 대한 ABC는 collections.abc 모듈에 정의되어 있습니다. 숫자 모듈은 숫자 데이터 유형에 대한 기본 클래스 모음인 숫자 타워를 정의합니다. Python 라이브러리의 'abc' 모듈은 사용자 정의 추상 기본 클래스를 정의하기 위한 인프라를 제공합니다.

'abc'는 기본 클래스의 메서드를 추상으로 표시하여 작동합니다. 이것은 @absttractmethod 데코레이터에 의해 수행됩니다. 그런 다음 추상 기반 클래스의 하위 클래스인 구체적인 클래스는 추상 메서드를 재정의하여 추상 기반을 구현합니다.

abc 모듈은 ABCMeta 를 정의합니다. 추상 베이스 클래스를 정의하기 위한 메타 클래스인 클래스. 다음 예제에서는 ABCMeta를 사용하여 Shape 클래스를 추상 기본 클래스로 정의합니다. 모양 클래스에는 추상 메서드로 장식된 area() 메서드가 있습니다.

이제 Rectangle 클래스는 상위 Shape 클래스를 상위로 사용하고 추상 area() 메서드를 구현합니다. 구체 클래스이므로 인스턴스화할 수 있고 구현된 area() 메소드를 호출할 수 있습니다.

import abc
class Shape(metaclass=abc.ABCMeta):
   @abc.abstractmethod
   def area(self):
      pass
class Rectangle(Shape):
   def __init__(self, x,y):
      self.l = x
      self.b=y
   def area(self):
      return self.l*self.b
r = Rectangle(10,20)
print ('area: ',r.area())

추상 기본 클래스에는 둘 이상의 추상 메서드가 있을 수 있습니다. 자식 클래스는 TypeError가 발생하는 실패를 모두 구현해야 합니다.

abc 모듈은 ABC 도 정의합니다. 추상 기본 클래스 정의에서 ABCMeta 클래스 대신 사용할 수 있는 도우미 클래스입니다.

class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass

추상 기반 클래스에서 서브클래싱하는 대신 레지스터 클래스 데코레이터를 통해 추상 기반으로 등록할 수 있습니다.

class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
@Shape.register
class Rectangle():
   def __init__(self, x,y):
   self.l = x
   self.b=y
   def area(self):
      return self.l*self.b

각각 @abstractclassmethod 및 @abstractstatic 메서드 데코레이터를 사용하여 추상 기본 클래스에 클래스 메서드와 정적 메서드를 제공할 수도 있습니다.