다른 답변에서 설명한 것처럼 그렇습니다 . abc
모듈을 사용하여 Python에서 추상 클래스를 사용할 수 있습니다 . 나는 추상적 사용하여 실제 예를 들어 줄 아래 @classmethod
, @property
그리고 @abstractmethod
(3.6 Python을 사용). 나를 위해 일반적으로 쉽게 복사하여 붙여 넣을 수있는 예제로 시작하는 것이 더 쉽습니다. 이 답변이 다른 사람들에게도 유용하기를 바랍니다.
먼저 다음과 같은 기본 클래스를 만듭니다 Base
.
from abc import ABC, abstractmethod
class Base(ABC):
@classmethod
@abstractmethod
def from_dict(cls, d):
pass
@property
@abstractmethod
def prop1(self):
pass
@property
@abstractmethod
def prop2(self):
pass
@prop2.setter
@abstractmethod
def prop2(self, val):
pass
@abstractmethod
def do_stuff(self):
pass
우리 Base
클래스에는 항상 from_dict
classmethod
, a property
prop1
(읽기 전용) 및 property
prop2
(설정 가능) 및 라는 함수가 do_stuff
있습니다. 현재 어떤 클래스를 기반으로 구축하든 Base
메소드 / 속성을 위해 이들 클래스를 모두 구현해야합니다. - 방법이 추상적이 될 수 있도록, 두 장식이 필요하다는 것을 유의하시기 바랍니다 classmethod
추상적 property
.
이제 다음 A
과 같은 클래스를 만들 수 있습니다 .
class A(Base):
def __init__(self, name, val1, val2):
self.name = name
self.__val1 = val1
self._val2 = val2
@classmethod
def from_dict(cls, d):
name = d['name']
val1 = d['val1']
val2 = d['val2']
return cls(name, val1, val2)
@property
def prop1(self):
return self.__val1
@property
def prop2(self):
return self._val2
@prop2.setter
def prop2(self, value):
self._val2 = value
def do_stuff(self):
print('juhu!')
def i_am_not_abstract(self):
print('I can be customized')
필요한 모든 메소드 / 프로퍼티가 구현되었으며 물론 Base
여기에 포함 되지 않은 추가 함수를 추가 할 수도 있습니다 (여기 :) i_am_not_abstract
.
이제 우리는 할 수 있습니다 :
a1 = A('dummy', 10, 'stuff')
a2 = A.from_dict({'name': 'from_d', 'val1': 20, 'val2': 'stuff'})
a1.prop1
# prints 10
a1.prop2
# prints 'stuff'
원하는대로 설정할 수 없습니다 prop1
.
a.prop1 = 100
돌아올 것이다
AttributeError : 속성을 설정할 수 없습니다
또한 우리의 from_dict
방법은 잘 작동합니다.
a2.prop1
# prints 20
이제 다음 B
과 같이 두 번째 클래스를 정의한 경우 :
class B(Base):
def __init__(self, name):
self.name = name
@property
def prop1(self):
return self.name
다음과 같이 객체를 인스턴스화하려고했습니다.
b = B('iwillfail')
우리는 오류를 얻을 것이다
TypeError : 추상 메소드 do_stuff, from_dict, prop2로 추상 클래스 B를 인스턴스화 할 수 없습니다
에 Base
구현하지 않은 모든 것을 나열합니다 B
.