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

бится загрузить отдельный модуль для того, чтобы их использовать. Мы сделаем

это в первой строке следующего примера:

>>> from collections import namedtuple

>>> Duck = namedtuple('Duck', 'bill tail')

>>> duck = Duck('wide orange', 'long')

>>> duck

Duck(bill='wide orange', tail='long')

>>> duck.bill

'wide orange'

>>> duck.tail

'long'

Именованный кортеж можно сделать также на основе словаря:

>>> parts = {'bill': 'wide orange', 'tail': 'long'}

>>> duck2 = Duck(**parts)

>>> duck2

Duck(bill='wide orange', tail='long')

В коде, показанном ранее, обратите внимание на конструкцию **parts. Это

аргумент — ключевое слово. Он извлекает ключи и значения словаря parts и пере-

дает их как аргументы в Duck(). По эффекту это похоже на следующий код:

>>> duck2 = Duck(bill = 'wide orange', tail = 'long')

Именованные кортежи неизменяемы, но вы можете заменить одно или несколь-

ко полей и вернуть другой именованный кортеж:

>>> duck3 = duck2._replace(tail='magnificent', bill='crushing')

>>> duck3

Duck(bill='crushing', tail='magnificent')

Мы могли бы объявить duck как словарь:

>>> duck_dict = {'bill': 'wide orange', 'tail': 'long'}

>>> duck_dict

{'tail': 'long', 'bill': 'wide orange'}

178

Глава 6. Ой-ой-ой: объекты и классы

Вы можете добавить поля в словарь:

>>> duck_dict['color'] = 'green'

>>> duck_dict

{'color': 'green', 'tail': 'long', 'bill': 'wide orange'}

Но не в именованный кортеж:

>>> duck.color = 'green'

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

AttributeError: 'dict' object has no attribute 'color'

Вспомним плюсы использования именованного кортежа.

 Они выглядят и действуют как неизменяемый объект.

 Они более эффективны, чем объекты, с точки зрения времени и занимаемого

места.

 Вы можете получить доступ к атрибутам с помощью точки вместо квадратных

скобок, характерных для словарей.

 Вы можете использовать их как ключ словаря.

Упражнения

1. Создайте класс, который называется Thing, не имеющий содержимого, и выве-

дите его на экран. Затем создайте объект example этого класса и также выведите