Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 132

176

Глава 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 автоматически, вам понадо-