2016-08-09 2 views
0

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의 소스 코드를보고 문서를 읽어야한다. 데코레이터와 코멘트는 하위 클래스를 구성하는 방법을 알려줍니다.

여기에 맞지 않습니까? 아니면 여기에 뭔가 빠졌습니까?

+0

이것이 바로 '추상적 인 속성'의 정의입니다. – user2357112

+0

''abstractproperty''는 python 3.3에서 더 이상 사용되지 않습니다. OP에는 3.3+에 대한 올바른 사용법이 있습니다. 하위 클래스에''@ property''와 함께''@ property''와''@ abstractmethod''를 함께 사용합니다. 하지만 하위 클래스를 올바르게 구현할 수는 없습니다. –

답변

1

ABC가이를 시행하지 않는 것이 맞습니다. "특정 장식자가 있습니다"와 같은 것을 시행 할 방법이 없습니다. Decorator는 객체를 반환하는 함수입니다 (예 : property은 속성 객체를 반환 함). ABCMeta는 클래스에 정의 된 속성이 특히 무엇이든 보장하기 위해 아무 것도하지 않습니다. 그냥 그들이 거기 있는지 확인합니다. 오류없이이 "작품"

class MyABC(metaclass=ABCMeta): 
    @abstractmethod 
    def my_abstract_method(self): 
     pass 

class MyClass(MyABC): 
    my_abstract_method = 2 

MyClass() 

입니다 ABCMeta 심지어 서브 클래스에 제공 한 추상적 인 방법이 전혀 방법 있는지 확인하지 않습니다. 해당 이름의 속성이 있어야합니다.

특정 속성에 특정 종류의 값이 있는지 확인하기 위해보다 정교한 검사를 수행하는 메타 데이터를 작성할 수는 있지만 ABCMeta의 범위를 벗어납니다.

+0

감사합니다. 저는 ABC가 특정 데코레이터를 정확히 확인할 수있을 것이라고 생각했습니다. 클래스 인스턴스를 반환하기 때문입니다 (정의 된 방법에 따라 다름). isinstance()를 사용하여 검사를 수행 할 수 있습니다. 모두 좋습니다. 내 '정적 유형'팬 보이 협동자를 행복하게 만드는 방법을 생각하려고했습니다. 나는 ABC가 인터페이스를 시행하는 데 사용될 수 있다고 읽었지 만 실제로 그렇지는 않습니다. – VagueAdvice

+0

@VagueAdvice : 데코레이터에 관해서 말하고자하는 것은, 데코레이터를 통해 또는 다른 수단을 통해 값이 생성되었는지 여부가 아닌, 속성의 값 유형 만 적용 할 수 있다는 것입니다. (그러나 어쨌든 ABC로 그 일을 할 수는 없습니다.) 정적 유형의 fanboys를 만족 시키려면 새로운'typing' 모듈을보고 싶을 것입니다. – BrenBarn

+0

나는 나중에 들어. 타이핑에 대한 조언 주셔서 감사합니다. 나는 그 사람들 fanboys에게 전화하는 것에 대해 농담하고 있었다. 분명히 정적 인 타이핑은 큰 이점을 가지고 있습니다. 여기서 스택을 변경하려고합니다. 파이썬을 추진하려고합니다. 그들은 이것을 큰 약점으로 삼았습니다. 나는 그곳에있는 것이 무엇인지보고 싶었고 ABC를 보았습니다. mypy를 lint로 사용하는 힌팅 (IDE 경고와 함께)이 원인을 도울 수 있습니다. – VagueAdvice

관련 문제