Глава 6. Ой-ой-ой: объекты и классы
>>> bill = Bill('wide orange')
>>> duck = Duck(bill, tail)
>>> duck.about()
This duck has a wide orange bill and a long tail
Когда лучше использовать классы
и объекты, а когда — модули
Рассмотрим несколько рекомендаций, которые помогут вам понять, где лучше раз-
местить свой код — в классе или в модуле.
Объекты наиболее полезны, когда вам нужно иметь некоторое количество от-
дельных экземпляров с одинаковым поведением (методами), но различающих-
ся внутренним состоянием (атрибутами).
Классы, в отличие от модулей, поддерживают наследование.
Если вам нужен только один объект, модуль подойдет лучше. Независимо от
того, сколько обращений к модулю имеется в программе, будет загружена толь-
ко одна копия. (Программистам на Java и С++: если вы знакомы с книгой Эри-
ха Гаммы «Приемы объектно-ориентированного проектирования. Паттерны
проектирования» (Gamma E. Design Patterns: Elements of Reusable Object-Oriented
Software), можете использовать модули в Python как синглтоны.)
Если у вас есть несколько переменных, которые содержат разные значения
и могут быть переданы как аргументы в несколько функций, лучше всего опре-
делить их как классы. Например, вы можете использовать словарь с ключами
size и color, чтобы представить цветное изображение. Вы можете создать разные
словари для каждого изображения в программе и передавать их в качестве
аргументов в функции scale() и transform(). По мере добавления новых ключей
и функций может начаться путаница. Более последовательно было бы опреде-
лить класс Image с атрибутами size или color и методами scale() и transform().
В этом случае все данные и методы для работы с цветными изображениями
будут определены в одном месте.
Используйте простейшее решение задачи. Словарь, список или кортеж проще,
компактнее и быстрее, чем модуль, который, в свою очередь, проще, чем класс.
Совет от Гвидо ван Россума: «Избегайте усложнения структур данных. Корте-
жи лучше объектов (можно воспользоваться именованными кортежами). Предпо-
читайте простые поля функциям, геттерам и сеттерам. Используйте больше чисел,
строк, кортежей, списков, множеств, словарей. Взгляните также на библиотеку
collections, особенно на класс deque».
Именованные кортежи. Поскольку Гвидо только что упомянул их, а я про них
еще не говорил, самое время рассмотреть именованные кортежи. Именованный
Когда лучше использовать классы и объекты, а когда — модули
177
кортеж — это подкласс кортежей, с помощью которых вы можете получить доступ
к значениям по имени (с помощью конструкции .name) и позиции (с помощью
конструкции [offset]).
Рассмотрим пример из предыдущего раздела и преобразуем класс Duck в имено-
ванный кортеж, сохранив bill и tail как простые строковые аргументы. Функцию
namedtuple можно вызвать, передав ей два аргумента:
имя;
строку, содержащую имена полей, разделенные пробелами.
Именованные кортежи не поддерживаются Python автоматически, вам понадо-