Найти - Пользователи
Полная версия: Наследование в Python
Начало » Python для новичков » Наследование в Python
1 2
Soteric
Здесь нет наследования. Создайте отдельно класс Bot, отдельно класс BaseAuth. В BaseAuth заведите абстрактный метод authenticate. Абстрактный, то есть каждый класс-наследник должен будет реализовать его по своему. От BaseAuth сделайте наследников LoginAuth, CookieAuth. Переопределите для них метод authenticate. В классе Bot создайте ссылку типа BaseAuth (ну или в питоне тип не нужен, но будем это подразумевать :) ). При необходимости авторизоваться вызывайте метод authenticate объекта, расположенного по этой ссылке. В зависимости от типа (LoginAuth, CookieAuth) аутентификация будет проходить по одному из ваших сценариев.
Ed
Если в BaseAuth ничего, кроме абстрактного authenticate не будет, то зачем он? Подразумевать можно и без этого :)
Soteric
На всякий случай.
maxwell
Ed, Soteric прав. Абстрагирование — вещь очень полезная.
Ed
В данном конкретном примере не вижу ничего полезного. Создается лишний уровень иерархии наследования, который в Питоне не нужен. Это нужно для людей, пришедших с языков с жесткой типизацией для понимания что происходит. Для тех, кто слышал про duck typing это не нужно.
Soteric
ИМХО восприятие питона как некоего элитарного языка, который не нуждается во всех фенечках придуманных наивными глупыми архитекторами убого кодящих на своих жестко типизированных языках, не идет на пользу его адептам. Сейчас срач наверное будет… меня уже побили на python-forum за то, что я проповедовал разнесение файлов по классам в стиле Java, сейчас и здесь побьют :)
Ed
Все гораздо проще - языки принципиально разные, поэтому и подходы разные. Python - не элитарный, он просто другой. И архитектор у него тоже есть и тоже неглупый.
maxwell
Ed, причем здесь питон? Абстрагирование — это нужно для программирования. Язык — инструмент.
Лучше написать три «ненужных» строчки если так модель будет выглядеть более «правильной» и логичной.
А про «данный пример» говорить вообще бессмысленно — нету полной постановки задачи, есть подозрение что там вообще все по-другому лучше делать.
Ed
Под ‘в данном конкретном примере’ я имел в виду это:
Создайте отдельно класс 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.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB