Интерфейс — не декларация, а набор дандеров в слотах типа; проверяемые контракты приделывали к языку дважды и оба раза позже.
len() как функция и невозможность синтезировать дандер через __getattr__Protocol (2017) — структурно; оба пристроены позже__exit__ умеет подавить исключение — полномочие, которого нет у деструктора