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 тоже выбросит исключение, но только при попытке вызвать какой-либо из нереализованных методов
Или так:
Преимущество — используются только стандартные средства.
Недостаток — ошибка вываливается при обращении к атрибуту, а не на этапе создания экземпляра.
class Movable:
@property
def speed(self):
raise NotImplementedError
def move(self):
raise NotImplementedError
Преимущество — используются только стандартные средства.
Недостаток — ошибка вываливается при обращении к атрибуту, а не на этапе создания экземпляра.
А можно попросить подсветить?
Не знаю как там в Zope. Но интерфейсы в нетипизированном языке — разве что дополнение к документации.
В общем-то да, такие штуки редко нужны. Однако, если система действительно большая и сложная, то без интерфейсов становится тяжеловато. Компонентную архитектуру ввели в Zope именно поэтому — упростить и разделить на явные стандартизированные составляющие.
Что бы там не говорили про Яву в малых и десктопных приложениях, а рынок средних-крупных систем для бизнеса и финансов она держит плотно, возможно, именно благодаря таким фишкам.
Что бы там не говорили про Яву в малых и десктопных приложениях, а рынок средних-крупных систем для бизнеса и финансов она держит плотно, возможно, именно благодаря таким фишкам.
Sign up to leave a comment.
Абстрактные классы и интерфейсы в Питоне