2015-01-29 2 views
2

나는 파이썬에서 추상 클래스 (v 2.7)를 처음 사용하고있다. 추상 클래스에 대한 몇 가지 자습서를 살펴 보았습니다. 추상 메소드를 구현하는 방법은 abc 모듈을 가져 와서 추상 메소드 데코레이터를 사용하는 것처럼 보입니다. 파이썬으로 왜이 클래스를 인스턴스화 할 수 있습니까? 나는 추상적 인 메소드를 구현하지 않고있다.

import abc 

class AbstractAlgorithm(object): 
    __metaclass__ = abc.ABCMeta 

    @abc.abstractmethod 
    def load(self, input): 
     """Retrieve data from the input source and return an object.""" 
     return 

    @abc.abstractmethod 
    def save(self, output, data): 
     """Save the data object to the output.""" 
     return 


class SpecificAlgorithm(object): 

    def load(self, input): 
     return input.read() 

AbstractAlgorithm.register(SpecificAlgorithm) 

나는 파이썬이 날 이렇게하지 것이라는 점을 알고있다 :

AbstractAlgorithm() ==> TypeError: Can't instantiate abstract class AbstractAlgorithm with abstract methods load, save 

그런데 왜 나는 추상적 인 방법 중 하나를 구현하지 않고 추상 클래스의 특정 버전을 인스턴스화 할 수 있어요? 나는 이것이 허용되지 않을 것이라고 생각할 것이다. 내가 뭔가 잘못하고 있는거야?

b = SpecificAlgorithm() 

답변

0

파이썬에서는 부모 추상 메소드를 호출 할 수 있습니다. 리턴 라인을 가짐으로써 메소드의 간단한 구현을 정의하게됩니다. 자식 클래스에서 구현을 만들지 않으면 부모 클래스의 구현이 사용됩니다. 이것은 파이썬 문서에서입니다 :

참고 : Java 추상 메소드와 달리 이러한 추상 메소드는 구현되어있을 수 있습니다. 이 구현은 super() 메커니즘을 오버라이드하는 클래스에서 호출 할 수 있습니다. 이는 협업 다중 상속을 사용하는 프레임 워크에서 수퍼 콜의 종점으로 유용 할 수 있습니다.

링크 : https://docs.python.org/3.4/library/abc.html

편집 : 나는 unutbu의 대답은 또한 함께 할 수있는 뭔가가 생각합니다.

+1

문제는 추상적 인 메소드가 구현되어 있지 않다는 것입니다. (이것들은 ...하지만 OP는 추상 구현을 호출하려고하지 않습니다. mentation 어쨌든 ...) 나는'.save' 메소드가 덮어 써지지 않았기 때문에 OP가 걱정된다고 생각하지만, SpecificAlgorithm은 AbstractAlgorithm의 가상 서브 클래스입니다. – mgilson

3

SpecificAlgorithm은 기본 클래스로 AbstractAlgorithm을 포함해야합니다. 그렇지 않으면 AbstractAlgorithm의 메타 클래스에서 자동 검사 메커니즘이 적용되지 않습니다. (마티 피에 터스가 지적으로 더 정확하게, ABCMeta records abstract methodscls.__abstractmethods__에서 재정의되지 않았 음. 인스턴스화되면, object.__new__ raises a TypeError 그것으로 오버라이드 (override)되어 있지 않은 추상적 인 방법을 발견합니다.)

class SpecificAlgorithm(AbstractAlgorithm): 
    ... 

b = SpecificAlgorithm() 
지금

수율을

TypeError: Can't instantiate abstract class SpecificAlgorithm with abstract methods save 
+0

특히'ABCMeta'에 의해 수집 된 메타 데이터를 기반으로 검사를하는 것은'object .__ new__' 메소드입니다. –

+0

등록은 마술처럼 'SpecificAlgorithm'을 추상화하는 방법을 강요하지 않습니다. 그것이하는 일은'Abstractinstance'와 함께 사용될 때'isinstance()'와'issubclass()'테스트가 작동합니다; 'issubclass (SpecificAlgorithm, AbstractAlgorithm)'과'isinstance (SpecificAlgorithm(), AbstractAlgorithm)'을 사용합니다. –

+0

@MartijnPieters : 수정/추가 정보에 대해 감사드립니다. – unutbu

관련 문제