Метод может быть переопределен, но не обязательно - PullRequest
0 голосов
/ 11 октября 2018

Я понимаю, что использование @abstractmethod в ABC означает, что метод должен быть реализован в конкретной реализации ABC.

Что если у меня есть класс с методами, которые можно быть переопределенным, но не обязательно?Как лучше всего сообщить пользователям, что метод должен быть переопределен для обеспечения функциональности?

Ситуация, когда базовый метод имеет значение :

import warnings

class BaseClass(object):
    def foo(self):
        """This method can do things, but doesn't."""

        warnings.warn('This method must be overridden to do anything.')

class ConcreteClass(BaseClass):
    def foo(self):
        """This method definitely does things."""

        # very complex operation
        bar = 5

        return bar

Использование:

>>> a = ConcreteClass()
>>> a.foo()
5

Ситуация, когда базовый метод не переопределен:

import warnings

class BaseClass(object):
    def foo(self):
        """This method can do things, but doesn't."""

        warnings.warn('This method must be overridden to do anything.')

class ConcreteClass(BaseClass):
    def other_method(self):
        """Completely different method."""

        # code here

    def yet_another_method(self):
        """One more different method."""

        # code here

Использование:

>>> a = ConcreteClass()
>>> a.foo()
__main__:1: UserWarning: This method must be overridden to do anything.

Причина, по которой я хочу использовать базовый методделать что-либо вообще в основном из-за удобства для пользователя.Коллеги в моей группе, у которых меньше опыта использования программного обеспечения, могут получить выгоду от удара сзади, напоминая им, что сценарий, который они написали с моим пакетом, не сломан, они просто забыли добавить что-то.

1 Ответ

0 голосов
/ 11 октября 2018

Метод в Python уже может быть переопределен, но не должен быть.
Итак, для остальной части вопроса:

Какой лучший способСообщите пользователям, что метод должен быть переопределен для обеспечения функциональности?

Вы можете поднять NotImplementedError:

class BaseClass(object):
    def foo(self):
        raise NotImplementedError

class ConcreteClass(BaseClass):
    def foo(self):
        pass

И относительно

удар сзади, напоминающий им, что сценарий, который они написали с моим пакетом, не сломан, они просто забыли что-то добавить.

Исключение гораздо более явное и полезноечем предупреждение (которое может быть легко пропущено, если напечатаны тысячи записей журнала)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...