ABC에서 상속받은 클래스의 메서드가 적절한 데코레이터를 사용하여 만들어 지는지 확인하는 방법을 찾으려고합니다. ABC가 일반적으로 어떻게 작동하는지 이해합니다.ABC가 메소드 데코레이터를 시행합니까?
from abc import ABCMeta, abstractmethod
class MyABC(metaclass=ABCMeta):
@abstractmethod
def my_abstract_method(self):
pass
class MyClass(MyABC):
pass
MyClass()
이것은 "형식 오류 : 추상 메소드의 my_abstract_method 추상적 인 MyClass 클래스를 인스턴스화 할 수 없습니다"제공합니다. 좋습니다. 그 이름을 가진 메소드를 생성하면됩니다.
class MyClass(MyABC):
def my_abstract_method(self):
pass
MyClass()
붐. 너 끝났어. 하지만이 사건은 어쩌고?
from abc import ABCMeta, abstractmethod
class MyABC(metaclass=ABCMeta):
@property
@abstractmethod
def my_attribute(self):
pass
class MyClass(MyABC):
def my_attribute(self):
pass
MyClass()
my_attribute가 속성이 아니더라도 MyClass() 호출이 작동합니다. 결국 모든 ABC는 주어진 이름의 메소드가 있는지 확인합니다. 그게 전부 야. 더 많은 것을 원한다면 MyABC의 소스 코드를보고 문서를 읽어야한다. 데코레이터와 코멘트는 하위 클래스를 구성하는 방법을 알려줍니다.
여기에 맞지 않습니까? 아니면 여기에 뭔가 빠졌습니까?
이것이 바로 '추상적 인 속성'의 정의입니다. – user2357112
''abstractproperty''는 python 3.3에서 더 이상 사용되지 않습니다. OP에는 3.3+에 대한 올바른 사용법이 있습니다. 하위 클래스에''@ property''와 함께''@ property''와''@ abstractmethod''를 함께 사용합니다. 하지만 하위 클래스를 올바르게 구현할 수는 없습니다. –