런타임에 자동으로 클래스를 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에서 추상 클래스를 초기화하는 방법을 결정하는 방법은 무엇입니까?
'ABCMeta'를 사용 했음에도 불구하고 실제로 보여줄 파이썬 2 코드의 "추상"클래스는 실제로 추상이 아닙니다. 즉, 원하는 경우 인스턴스를 생성 할 수 있으며 파이썬은 예외를 발생시키지 않습니다. 실제로 추상적 인 것을 만들기 위해서는 당신이 선언 한 몇몇 메소드에서'@ abstractmethod' 데코레이터를 사용해야합니다. 자식 클래스는 데코레이터 자체를 사용하지 않고 이러한 메서드를 재정의하지 않는 한 추상 클래스가됩니다. 나는 근본적인 문제를 먼저 고치지 않으면 서 정중 한 대답을 당신의 질문에 줄 수 있을지 확신하지 못합니다. – Blckknght
입력을 감사드립니다. 귀하의 의견은 저에게 좀 더 연구를 할 것을 촉구했습니다. 그리고 이제는 "추상적"에 대한 나의 처음 이해가 올바르지 않았 음을 알았습니다. 나는 이것을 약간 생각해야 할 것이다. 우리는 코드베이스에서이 패턴을 많이 사용하지만, 궁극적으로 잘못된 방법으로 도구를 사용한다면 장기적으로 큰 문제가 발생할 것입니다. – user5568265