это в первой строке следующего примера:
>>> 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 этого класса и также выведите