Комментарии 9
Где-то видел такой подход:
class interface: def query(self): pass def select(self): pass
0
class Derived(interface): pass derived_object = Derived()
Будет работать, несмотря на то что потомок не реализовал методы query и select.
Если бы в этом случае использовался, например, модуль ABC, то при попытке создать экземпляр класса Derived выбросилось бы исключение TypeError. Пример пользователя neithere тоже выбросит исключение, но только при попытке вызвать какой-либо из нереализованных методов
0
Или так:
Преимущество — используются только стандартные средства.
Недостаток — ошибка вываливается при обращении к атрибуту, а не на этапе создания экземпляра.
class Movable: @property def speed(self): raise NotImplementedError def move(self): raise NotImplementedError
Преимущество — используются только стандартные средства.
Недостаток — ошибка вываливается при обращении к атрибуту, а не на этапе создания экземпляра.
+6
А можно попросить подсветить?
0
Не знаю как там в Zope. Но интерфейсы в нетипизированном языке — разве что дополнение к документации.
+3
В общем-то да, такие штуки редко нужны. Однако, если система действительно большая и сложная, то без интерфейсов становится тяжеловато. Компонентную архитектуру ввели в Zope именно поэтому — упростить и разделить на явные стандартизированные составляющие.
Что бы там не говорили про Яву в малых и десктопных приложениях, а рынок средних-крупных систем для бизнеса и финансов она держит плотно, возможно, именно благодаря таким фишкам.
Что бы там не говорили про Яву в малых и десктопных приложениях, а рынок средних-крупных систем для бизнеса и финансов она держит плотно, возможно, именно благодаря таким фишкам.
+5
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.
Абстрактные классы и интерфейсы в Питоне