2016-07-11 2 views
0

У меня есть класс, который реализует стратегию. В рамках более широкого стратегического API он имеет открытый интерфейс. В этом конкретном классе main_method применяет различные условия и для каждого условия имеет метод helper_.... Таким образом, путем подклассификации и переопределения этих вспомогательных методов вы можете изменить поведение стратегии. Это предназначено. Однако эти вспомогательные методы не являются частью API, который реализуется/подвергается воздействию клиента.Методы, предназначенные для переопределения, но не являющиеся частью общедоступного API

Мне кажется, что эти методы следует считать приватными, поскольку они не являются частью интерфейса, который реализуется, но, с другой стороны, они предназначены для переопределения подклассами. В Java они будут «защищены».

Что такое питонический способ справиться с этой ситуацией? Мой код схематичен следующим образом:

class BasicFoo(Object): 

    def __init__(self): 
     pass 

    def main_method(self, input) : 
     if condition_1 : 
      self._helper1(input) 
     elif condition_2 : 
      self._helper2(input) 
     else : 
      self._helper3(input) 

    def _helper1(self, input) 
     # do something 

    def _helper2(self, input): 
     # do something else 

    def _helper3(self, input): 
     # do something else again 

class ModifiedFoo(BasicFoo): 

    def __init__(self): 
     super(ModifiedFoo, self).__init__() 

    def _helper1(self, input): 
     # a different behaviour 
+0

В чем проблема с тем, что вы имеете сейчас? Кто выполняет эти подклассы? Есть ли у них проблема с переопределением методов private-by-convention? – jonrsharpe

+0

Я думаю, что лучшее место для этого было бы здесь: http://codereview.stackexchange.com/ –

+1

@DeanFenster Или вы могли бы [прочитать, что по теме для обзора кода] (http://codereview.stackexchange.com/help/on-topic) и узнайте, что гипотетический код будет закрыт сразу же. –

ответ

1

Просто сделайте эти методы общедоступными и уточните их предполагаемое использование в документации. Возьмем пример из ast.NodeVisitor класса из стандартной библиотеки:

предназначен этот класс подклассов, с подклассом добавления методов посетителю.

visit(node)

Посетите узел. Реализация по умолчанию вызывает метод с именем self.visit_classname, где classname - это имя класса узла, или generic_visit(), если этот метод не существует.

Учитывая, что в Python у вас нет модификаторов доступа, вы можете полагаться только на документацию и соглашения, чтобы разъяснить роли таких методов. В этом случае ваши методы составляют часть публичного API (частный атрибут/метод можно переименовать на досуге между релизами, но здесь это не так).

Смежные вопросы