2017-10-13 3 views
0

, 나는 다음과 같은 사용하여 추상 클래스를 만들 수 있습니다추상 메서드를 사용하지 않고 abc를 사용하여 추상 클래스를 만드는 방법은 무엇입니까? ABC를 사용

from abc import ABC, abstractmethod 
class A(ABC): 
    @abstractmethod 
    def foo(self): 
     print('foo') 
class B(A): 
    pass 

obj = B() 

B이 방법 foo을 정의하지 않았기 때문에이 실패합니다. 이것은 Java의 추상 메소드 기능을 모방 한 것입니다.

나는 추상 클래스의 기능은 또한 클래스의 인스턴스는 어떤 추상적 인 방법을하지 않고 방지 파이썬에있는 경우 알고 싶어.

+0

질문이 없습니다. 어떤 추상적 인 방법을 사용하지 않고도 클래스의 인스턴스화가 방지되는 곳은 무엇을 의미합니까? 당신은 추상 메소드를 구현하기 위해 클래스 자체를 시행하기를 원합니까? – Vinny

+0

Java에서 추상 메소드와 추상 클래스는 두 가지 개념입니다. 추상 메소드는 서브 클래스에 의해 정의되어야하며 추상 클래스는 인스턴스화 될 수 없습니다. 하지만 Python의 abc 모듈에서 (내 이해) 둘 다 묶여 있습니다. 어떤 메소드를 추상 메소드로 꾸미지 않고 추상 클래스를 정의 할 수있는 방법이 있습니까? –

답변

0

추상 클래스를 initalizing 방지하는 간단한 방법은 다음과 같습니다

class Abs(object): 
    def __init__(self, *args, **kwargs): 
     raise NotImplementedError('abstract class can not be initalized') 

    def some_func(self): 
     raise NotImplementedError 

이 정보 메시지와 함께 예외가 발생하고 클래스가 initalized 수 있도록하지 않습니다. 그러한 객체의 인스턴스를 생성하려면 서브 클래 싱이 필요합니다.

있어서 너무 추상적이다 : 그들은 대체 방법에 클래스를 유도 필요할 때

[...] 사용자 정의 기본 클래스에서 추상 방법이 예외를 제기해야 또는 실제 구현이 여전히 추가되어야 함을 나타 내기 위해 클래스가 개발되는 동안. 추상 같은 방법을 선언하는 또 다른 방법이다

. 그 차이는 클래스 B는 푸 메소드를 재정의하지 않은 경우, 인스턴스 오브젝트가 생성 될 때 raise NotImplementedError 실행될 때만 실패하고 없지만 @abstractmethodTypeError: Can't instantiate abstract class B with abstract methods foo을 올릴 것이다.

0

파이썬에서 추상 클래스를 생성하는 기존의 방법은 내장 예외 NotImplementedError를 제기하는 것입니다.

class A(object): 
    def __init__(self): 
     raise NotImplementedError('abstract base class') 

class B(A): 
    def __init__(self): 
     # don't call A.__init__ here. 
     pass 

b = B() 
# a = A() # This will fail. 
관련 문제