LINUX.ORG.RU

[python] Что у нас с абстрактным базовым классом в 2.5?

 


0

1

...в 2.6 и 3.х subj добавили, но, что интересно, несовместимыми способами (мотивация для такого решения от меня ускользает). Зачем это было сделано и как наименее костыльно делать базовый класс абстрактным в версиях 2.5 и младше?

>как наименее костыльно делать базовый класс абстрактным в версиях 2.5 и младше?

А что ты хочешь от абстрактного базового класса, чем обычный в данном случае не подойдёт? Запрет создания инстанса для него?

anonymous
()

Поддерживаю предыдущего оратора - я не вижу никакой особой практической необходимости в использовании ABC в python.

в 2.6 и 3.х subj добавили


Лучше бы они в реализации zope.interface порядок навели и в стандартную библиотеку её добавили, чем эти ваши ABC, право слово.

Если вы пытаетесь перенести какие-то известные вам паттерны из джавы или плюсов - бросьте это. Пишите лучше сразу на python.

shylent
()
Ответ на: комментарий от anonymous

> А что ты хочешь от абстрактного базового класса, чем обычный в данном случае не подойдёт? Запрет создания инстанса для него?

Хочу наследование интерфейса, а не реализации

dens-dens-dens
() автор топика

Добавлю, что если очень хочется, то можно покрутить метод __new__ и метаклассы, чтобы запретить создание инстанса. Но вот зачем?

anonymous
()
Ответ на: комментарий от shylent

> я не вижу никакой особой практической необходимости в использовании ABC в python.

http://ru.wikipedia.org/wiki/Хрупкий_базовый_класс

Лучше бы они в реализации zope.interface


А чем это лучше чем ABC?

Если вы пытаетесь перенести какие-то известные вам паттерны из джавы или плюсов


Нет, первый раз столкнулся с необходимостью в abs при реализации общего интерфейса для нескольких моделей в django, в ORM которого есть ограничение на переопределение полей в моделях, унаследованных от неабстрактного класса. Абстрактный же реализуется посредством подкласса Meta (absract = True). Стало интересно, на сколько это «питонично» и проканает ли за рамками фреймворка.

dens-dens-dens
() автор топика
Ответ на: комментарий от anonymous

> Добавлю, что если очень хочется, то можно покрутить метод __new__ и метаклассы, чтобы запретить создание инстанса

Запрет создание - не основное требования, даже, скажем так, необязательное.

Но вот зачем?


Такой Evil Singleton - запрещает создавать даже 1 объект :)

dens-dens-dens
() автор топика
Ответ на: комментарий от shylent

> Как минимум два решения без ABC:

zope.interface - это первое. А второе?

dens-dens-dens
() автор топика
Ответ на: комментарий от dens-dens-dens

>> я не вижу никакой особой практической необходимости в использовании ABC в python.

http://ru.wikipedia.org/wiki/Хрупкий_базовый_класс


И что вы хотели мне сказать этой ссылкой на википедию? Что такое ABC и для чего они нужны (в других языках) я знаю. В python от них я пользы не вижу. Использовать их можно, да, хуже от этого не будет. Пользы же - нет.

А чем это лучше чем ABC?


А вы документацию и того, и другого прочитайте и сравните - так будет лучше всего. Заодно и выясните, что вам нужно, а что - нет.

shylent
()
Ответ на: комментарий от shylent

> И что вы хотели мне сказать этой ссылкой на википедию?

Хотел сказать, что ABS частично решает эту проблему - наследуется не реализация, а интерфейс и довольно просто можно задать методы, необходимые для обязательного переопределения в производных классах.

В python от них я пользы не вижу


Несмотря на это, их реализовали в Python 3, и не в виде zope.interface, возможно из-за того, что посчитали лучшим решением вписывающимся в общею идеологию питона. Вы же утверждаете, что они не нужны. Поэтому и вопрос - чем лучше zope.interface, чем он «нужнее»?

dens-dens-dens
() автор топика
Ответ на: комментарий от shylent

>Как минимум два решения без ABC:

raise NotImplementedError(«Must be overriden in subclasses»)

Единственно, NotImplementedError не даёт возможности узнать, все ли методы были переопределены до их вызова. Впрочем, опять же можно накрутить какой-нибудь хитрый костыль на это.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.