исключение для уведомления того подкласса должно реализовать метод в Python

предположите, что я хочу создать абстрактный класс в Python с некоторыми методами, которые будут реализованы подклассами. (в Python)

например:

class Base():
    def f(self):
        print "Hello."
        self.g()
        print "Bye!" 

class A(Base):
    def g(self):
        print "I am A"

class B(Base):
    def g(self):
        print "I am B"

Я хотел бы это, если базовый класс инстанцируют и его f () названный метод, когда g () называют, исключение для повышения, сообщая, что подкласс должен иметь реализованный метод g ().

Что обычная вещь состоит в том, чтобы сделать здесь? Я должен повысить NotImplementedError? или есть ли более особенный метод выполнения его?

Большое спасибо!
Manuel

10
задан Manuel Aráoz 13 August 2010 в 03:20
поделиться

3 ответа

В Python 2.6 и выше, вы можете использовать модуль abc , чтобы сделать Base «фактически» абстрактным базовым классом:

import abc

class Base:
    __metaclass__ = abc.ABCMeta
    @abc.abstractmethod
    def g(self):
        pass
    def f(self): # &c

это гарантирует, что Base не может быть создан - и ни то, ни другое не может любой подкласс, который не может переопределить g - при достижении цели @Aaron разрешить подклассам использовать super в их реализациях g . В целом, это гораздо лучшее решение, чем то, что мы использовали в Python 2.5 и ранее!

Дополнительное примечание: наличие наследования Base от объекта было бы излишним, потому что метакласс в любом случае нужно установить явно.

13
ответ дан 3 December 2019 в 21:57
поделиться

Создайте метод, который ничего не делает, но по-прежнему имеет строку документации, объясняющую интерфейс. Получение NameError сбивает с толку, а повышение NotImplementedError (или любого другого исключения, если на то пошло) нарушит правильное использование super .

3
ответ дан 3 December 2019 в 21:57
поделиться

Питер Норвиг дал решение этой проблемы в своем списке нечасто задаваемых вопросов Python . Я воспроизведу это здесь. Проверьте качество воздуха в помещении, это очень полезно.

## Python
class MyAbstractClass:
    def method1(self): abstract

class MyClass(MyAbstractClass): 
    pass

def abstract():
    import inspect
    caller = inspect.getouterframes(inspect.currentframe())[1][3]
    raise NotImplementedError(caller + ' must be implemented in subclass')
0
ответ дан 3 December 2019 в 21:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: