Нет, на самом деле, в подавляющем большинстве случаев не для проверки значений типа, как в вашем втором подходе.Идея состоит в том, что клиент вашего кода (то есть какой-то другой программист, который использует ваш класс) должен иметь возможность передавать любой тип объекта, который имеет все соответствующие методы или свойства.Если это не экземпляр какого-то определенного класса, это нормально;ваш код никогда не должен знать разницу.Это называется утка, набирающая , из-за пословицы «Если она крякает как утка и летит как утка, это может быть и утка» (ну, это не настоящая пословица, но я понялоб этом я думаю)
В одном месте вы увидите это в стандартной библиотеке со всеми функциями, которые обрабатывают ввод или вывод файла.Вместо того, чтобы требовать фактический объект file
, они будут использовать для записи все, что реализует метод read()
или readline()
(в зависимости от функции) или write()
.На самом деле вы часто будете видеть это в документации, например, с tokenize.generate_tokens
, который я только что рассмотрел ранее сегодня:
Генератор generate_tokens()
требуетодин аргумент, readline , который должен быть вызываемым объектом, который обеспечивает тот же интерфейс, что и метод readline()
встроенных файловых объектов (см. раздел File Objects ).Каждый вызов функции должен возвращать одну строку ввода в виде строки.
Это позволяет вам использовать объект StringIO
(например, файл в памяти) или что-то более странное, например диалоговое окно.вместо реального файла.
В своем собственном коде просто получите доступ к любым свойствам объекта, который вам нужен, и если это неправильный тип объекта, одно из необходимых вам свойств не будет там иэто вызовет исключение.