Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 27, 2011 14:51:10

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Наследование в Python

Здесь нет наследования. Создайте отдельно класс Bot, отдельно класс BaseAuth. В BaseAuth заведите абстрактный метод authenticate. Абстрактный, то есть каждый класс-наследник должен будет реализовать его по своему. От BaseAuth сделайте наследников LoginAuth, CookieAuth. Переопределите для них метод authenticate. В классе Bot создайте ссылку типа BaseAuth (ну или в питоне тип не нужен, но будем это подразумевать :) ). При необходимости авторизоваться вызывайте метод authenticate объекта, расположенного по этой ссылке. В зависимости от типа (LoginAuth, CookieAuth) аутентификация будет проходить по одному из ваших сценариев.



Офлайн

#2 Янв. 28, 2011 11:08:25

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Наследование в Python

Если в BaseAuth ничего, кроме абстрактного authenticate не будет, то зачем он? Подразумевать можно и без этого :)



Офлайн

#3 Янв. 28, 2011 12:21:38

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Наследование в Python

На всякий случай.



Офлайн

#4 Янв. 28, 2011 12:26:15

maxwell
От:
Зарегистрирован: 2008-08-26
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование в Python

Ed, Soteric прав. Абстрагирование — вещь очень полезная.



Офлайн

#5 Янв. 28, 2011 13:58:52

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Наследование в Python

В данном конкретном примере не вижу ничего полезного. Создается лишний уровень иерархии наследования, который в Питоне не нужен. Это нужно для людей, пришедших с языков с жесткой типизацией для понимания что происходит. Для тех, кто слышал про duck typing это не нужно.



Офлайн

#6 Янв. 28, 2011 14:27:04

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Наследование в Python

ИМХО восприятие питона как некоего элитарного языка, который не нуждается во всех фенечках придуманных наивными глупыми архитекторами убого кодящих на своих жестко типизированных языках, не идет на пользу его адептам. Сейчас срач наверное будет… меня уже побили на python-forum за то, что я проповедовал разнесение файлов по классам в стиле Java, сейчас и здесь побьют :)



Офлайн

#7 Янв. 28, 2011 15:01:28

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Наследование в Python

Все гораздо проще - языки принципиально разные, поэтому и подходы разные. Python - не элитарный, он просто другой. И архитектор у него тоже есть и тоже неглупый.



Офлайн

#8 Янв. 28, 2011 15:31:51

maxwell
От:
Зарегистрирован: 2008-08-26
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование в Python

Ed, причем здесь питон? Абстрагирование — это нужно для программирования. Язык — инструмент.
Лучше написать три «ненужных» строчки если так модель будет выглядеть более «правильной» и логичной.
А про «данный пример» говорить вообще бессмысленно — нету полной постановки задачи, есть подозрение что там вообще все по-другому лучше делать.



Офлайн

#9 Янв. 28, 2011 17:18:42

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Наследование в Python

Под ‘в данном конкретном примере’ я имел в виду это:

Создайте отдельно класс 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.



Отредактировано (Янв. 28, 2011 17:22:02)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version