2016-08-01 2 views
0

런타임에 자동으로 클래스를 dict에 등록하는 메타 클래스를 작성했습니다. 제대로 작동하려면 추상 클래스를 무시할 수 있어야합니다.Python 3에서 클래스가 추상 클래스인지 확인하는 방법은 무엇입니까?

def AutoRegister(registry, base_type=ABCMeta): 
    class _metaclass(base_type): 
     def __init__(self, what, bases=None, attrs=None): 
      super(_metaclass, self).__init__(what, bases, attrs) 

      # Do not register abstract classes. 
      # Note that we do not use `inspect.isabstract` here, as 
      # that only detects classes with unimplemented abstract 
      # methods - which is a valid approach, but not what we 
      # want here. 
      # :see: http://stackoverflow.com/a/14410942/ 
      metaclass = attrs.get('__metaclass__') 
      if not (metaclass and issubclass(metaclass, ABCMeta)): 
       registry.register(self) 

    return _metaclass 
:

코드는 파이썬이 정말 잘 작동하지만 파이썬 3. 여기

과 호환 만들려고 벽에 실행 한 코드가 현재의 모습입니다 파이썬 2

사용법은 다음과 같습니다

# Abstract classes; these are not registered. 
class BaseWidget(object): __metaclass__ = AutoRegister(widget_registry) 
class BaseGizmo(BaseWidget): __metaclass__ = ABCMeta 

# Concrete classes; these get registered. 
class AlphaWidget(BaseWidget): pass 
class BravoGizmo(BaseGizmo): pass 

내가 캘리포니아 하지만 파이썬 3에서이 작업을 수행하는 방법은 알지 못합니다.

메타 클래스가 파이썬 3에서 추상 클래스를 초기화하는 방법을 결정하는 방법은 무엇입니까?

+0

'ABCMeta'를 사용 했음에도 불구하고 실제로 보여줄 파이썬 2 코드의 "추상"클래스는 실제로 추상이 아닙니다. 즉, 원하는 경우 인스턴스를 생성 할 수 있으며 파이썬은 예외를 발생시키지 않습니다. 실제로 추상적 인 것을 만들기 위해서는 당신이 선언 한 몇몇 메소드에서'@ abstractmethod' 데코레이터를 사용해야합니다. 자식 클래스는 데코레이터 자체를 사용하지 않고 이러한 메서드를 재정의하지 않는 한 추상 클래스가됩니다. 나는 근본적인 문제를 먼저 고치지 않으면 서 정중 한 대답을 당신의 질문에 줄 수 있을지 확신하지 못합니다. – Blckknght

+0

입력을 감사드립니다. 귀하의 의견은 저에게 좀 더 연구를 할 것을 촉구했습니다. 그리고 이제는 "추상적"에 대한 나의 처음 이해가 올바르지 않았 음을 알았습니다. 나는 이것을 약간 생각해야 할 것이다. 우리는 코드베이스에서이 패턴을 많이 사용하지만, 궁극적으로 잘못된 방법으로 도구를 사용한다면 장기적으로 큰 문제가 발생할 것입니다. – user5568265

답변

0

PEP3119은 ABCMeta 메타 클래스가 추상 메소드를 "표시"하는 방법을 설명하고 아직 추상적 인 클래스의 모든 메소드를 포함하는 프런트 세트 __abstractmethods__을 생성합니다. 따라서 클래스 cls이 추상적인지 확인하려면 cls.__abstractmethods__이 비어 있는지 확인하십시오.

또한 유용한 this relevant post on abstract classes이 나왔습니다.

관련 문제