Реализации в азбуке - PullRequest
0 голосов
/ 02 октября 2018

Я создаю иерархию классов с базовым типом, который будет иметь 2 (и, вероятно, в будущем) реализации подкласса.

Моя первая идея - создать абстрактный базовый класс (унаследованный от * 1003).*) с @abstractmethod s, где это необходимо (для методов, которые будут отличаться в моих конкретных подклассах), но также с общими реализациями методов (для методов, используемых всеми конкретными подклассами).

Вот пример того, что я имею в виду:

from abc import ABC, abstractmethod

class BaseClass(ABC):

    def __init__(self, var1, var2):
        self.var1 = var1
        self.var2 = var2

    def common_method(self):
        """This method is used as-is by all subclasses."""

        return self.var1 + 1

    @abstractmethod
    def specific_method(self):
        """This method needs specific implementations."""

Является ли это хорошей практикой (а не "наилучшей практикой"; я ищу, является ли это правильным использованием этих конструкций) для написания базового класса?Является ли использование методов экземпляра в моем BaseClass уместным?

Ответы [ 2 ]

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

Абстрактные базовые классы используются для гарантии того, что любой производный класс обеспечивает определенное поведение (https://www.python.org/dev/peps/pep-3119 -> rationale).Например, вы хотите создать собственный менеджер данных, который должен иметь возможность сохранять / загружать данные и должен поддерживать итерацию по элементарным частям данных:

import abc


class SavableLoadable(abc.ABC):

    @abc.abstractmethod
    def save(self):
        raise NotImplementedError

    @abc.abstractmethod
    def load(self):
        raise NotImplementedError


class Iteratable(abc.ABC):

    @abc.abstractmethod
    def __iter__(self):
        raise NotImplementedError


class MyDataManager(Iteratable, SavableLoadable):

    def __init__(self):
        pass

    def __iter__(self):
        pass

    def save(self):
        pass

    def load(self):
        pass

Это не иерархия классов.Это способ определить поведенческий слой через наследование.Азбука очень полезна для крупномасштабных проектов, в которых разные авторы создают разные части, и должны иметь возможность работать вместе.

Поэтому вам не нужны азбуки для создания иерархии классов.Азбука служит другой (хотя и довольно близкой) цели.

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

я бы сказал: да.

Существует шаблон проектирования под названием Шаблонный метод , который фиксирует то, что вы описываете в своем вопросе, см. https://sourcemaking.com/design_patterns/template_method.

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