Pull to refresh

Comments 9

Где-то видел такой подход:
class interface:
    def query(self):
        pass
    def select(self):
        pass

class Derived(interface):
    pass

derived_object = Derived()


Будет работать, несмотря на то что потомок не реализовал методы query и select.
Если бы в этом случае использовался, например, модуль ABC, то при попытке создать экземпляр класса Derived выбросилось бы исключение TypeError. Пример пользователя neithere тоже выбросит исключение, но только при попытке вызвать какой-либо из нереализованных методов
Не пробовал, но, думаю, аналогичный abc функционал можно сделать инвариантами в zope.interfaces
Или так:

class Movable:    
    @property
    def speed(self):
        raise NotImplementedError
    def move(self):
        raise NotImplementedError

Преимущество — используются только стандартные средства.
Недостаток — ошибка вываливается при обращении к атрибуту, а не на этапе создания экземпляра.
Ну вы сами все сказали. Развитие этой идеи и приводит к интерфейсам либо велосипедо-интерфейсам.
А можно попросить подсветить?
Можно. Ночью лень уже стало заморачиваться :)
Не знаю как там в Zope. Но интерфейсы в нетипизированном языке — разве что дополнение к документации.
В общем-то да, такие штуки редко нужны. Однако, если система действительно большая и сложная, то без интерфейсов становится тяжеловато. Компонентную архитектуру ввели в Zope именно поэтому — упростить и разделить на явные стандартизированные составляющие.

Что бы там не говорили про Яву в малых и десктопных приложениях, а рынок средних-крупных систем для бизнеса и финансов она держит плотно, возможно, именно благодаря таким фишкам.
Sign up to leave a comment.

Articles