Soteric
Янв. 27, 2011 14:51:10
Здесь нет наследования. Создайте отдельно класс Bot, отдельно класс BaseAuth. В BaseAuth заведите абстрактный метод authenticate. Абстрактный, то есть каждый класс-наследник должен будет реализовать его по своему. От BaseAuth сделайте наследников LoginAuth, CookieAuth. Переопределите для них метод authenticate. В классе Bot создайте ссылку типа BaseAuth (ну или в питоне тип не нужен, но будем это подразумевать :) ). При необходимости авторизоваться вызывайте метод authenticate объекта, расположенного по этой ссылке. В зависимости от типа (LoginAuth, CookieAuth) аутентификация будет проходить по одному из ваших сценариев.
Ed
Янв. 28, 2011 11:08:25
Если в BaseAuth ничего, кроме абстрактного authenticate не будет, то зачем он? Подразумевать можно и без этого :)
Soteric
Янв. 28, 2011 12:21:38
На всякий случай.
maxwell
Янв. 28, 2011 12:26:15
Ed, Soteric прав. Абстрагирование — вещь очень полезная.
Ed
Янв. 28, 2011 13:58:52
В данном конкретном примере не вижу ничего полезного. Создается лишний уровень иерархии наследования, который в Питоне не нужен. Это нужно для людей, пришедших с языков с жесткой типизацией для понимания что происходит. Для тех, кто слышал про duck typing это не нужно.
Soteric
Янв. 28, 2011 14:27:04
ИМХО восприятие питона как некоего элитарного языка, который не нуждается во всех фенечках придуманных наивными глупыми архитекторами убого кодящих на своих жестко типизированных языках, не идет на пользу его адептам. Сейчас срач наверное будет… меня уже побили на python-forum за то, что я проповедовал разнесение файлов по классам в стиле Java, сейчас и здесь побьют :)
Ed
Янв. 28, 2011 15:01:28
Все гораздо проще - языки принципиально разные, поэтому и подходы разные. Python - не элитарный, он просто другой. И архитектор у него тоже есть и тоже неглупый.
maxwell
Янв. 28, 2011 15:31:51
Ed, причем здесь питон? Абстрагирование — это нужно для программирования. Язык — инструмент.
Лучше написать три «ненужных» строчки если так модель будет выглядеть более «правильной» и логичной.
А про «данный пример» говорить вообще бессмысленно — нету полной постановки задачи, есть подозрение что там вообще все по-другому лучше делать.
Ed
Янв. 28, 2011 17:18:42
Под ‘в данном конкретном примере’ я имел в виду это:
Создайте отдельно класс Bot, отдельно класс BaseAuth. В BaseAuth заведите абстрактный метод authenticate. Абстрактный, то есть каждый класс-наследник должен будет реализовать его по своему. От BaseAuth сделайте наследников LoginAuth, CookieAuth. Переопределите для них метод authenticate.
Я считаю, что достаточно сделать так:
class LoginAuth:
def authenticate(self):
...
class CookieAuth:
def authenticate(self):
...
Делать так:
class BaseAuth:
def authenticate(self):
raise NotImplementedError
class LoginAuth(BaseAuth):
def authenticate(self):
...
class CookieAuth(BaseAuth):
def authenticate(self)
...
на мой взгляд не pythonic. Так можно до getter-ов с settera-ми дойти :)
Если уж так хочется абстрактных методов, то правильнее будет сделать через abc.abstractmethod.