178 Глава 5 • Общие
структуры данных Python
>>> car1 = Car('красный', 3812.4, True)
# Экземпляры имеют хороший метод repr:
>>> car1 Car(цвет='красный', пробег=3812.4, автомат=True)
# Доступ к полям:
>>> car1.пробег 3812.4
# Поля неизменяемы:
>>> car1.пробег = 12
AttributeError: "can't set attribute"
>>> car1.лобовое_стекло = 'треснутое'
AttributeError:
"'Car' object has no attribute 'лобовое_стекло'"
# Аннотации типа не поддерживаются без отдельного
# инструмента проверки типов, такого как mypy:
>>> Car('красный', 'НЕВЕЩЕСТВЕННЫЙ', 99)
Car(цвет='красный', пробег='НЕВЕЩЕСТВЕННЫЙ', автомат=99)
struct .Struct — сериализованные С-структуры
Класс
struct.Struct
1
выполняет преобразование между значениями
Python и структурами C, сериализованными в форму объектов Python
bytes
. Например, он может использоваться для обработки двоичных
данных, хранящихся в файлах или поступающих из сетевых соединений.
Структуры
Struct
определяются с использованием форматного строко-
подобного мини-языка, который позволяет определять расположение
различных типов данных C, таких как
char
,
int
и
long
, а также их без-
знаковых вариантов.
Сериализованные структуры редко используются для представления объ-
ектов данных, предназначенных для обработки исключительно внутри
кода Python. Они нужны в первую очередь в качестве формата обмена
данными, а не как способ их хранения в оперативной памяти, применяе-
мый только программным кодом Python.
В некоторых случаях упаковка примитивных данных в структуры по-
зволяет уменьшить объем потребляемой оперативной памяти, чем их
1
См. документацию Python «struct.Struct»:
https://docs .python .org/3/library/struct .
html#module-struct
5 .3 . Записи, структуры
и объекты переноса данных 179
хранение в других типах данных. Однако чаще всего такая работа будет
довольно продвинутой (и, вероятно, ненужной) оптимизацией.
>>>
from struct import Struct
>>> MyStruct = Struct('i?f')
>>> data = MyStruct.pack(23, False, 42.0)
# Вы получаете двоичный объект данных (blob):
>>> data
b'x17x00x00x00x00x00x00x00x00x00(B'
# BLOB-объекты можно снова распаковать:
>>> MyStruct.unpack(data)
(23, False, 42.0)
types .SimpleNamespace — причудливый
атрибутивный доступ
А вот еще один «эзотерический» вариант реализации объектов данных
в Python:
types.SimpleNamespace
1
. Этот класс был добавлен в Python 3.3,
и он обеспечивает атрибутивный доступ к своему пространству имен.
Это означает, что экземпляры
SimpleNamespace
показывают все свои клю-
чи как атрибуты класса. А значит, вы можете использовать «точечный»
атрибутивный доступ
объект.ключ
вместо синтаксиса с индексацией
в квадратных скобках
объект['ключ']
, который применяется обычными
словарями. Все экземпляры также по умолчанию включают содержатель-
ный
метод
__repr__
.
Как видно из его названия, тип
SimpleNamespace
прост в использовании!
Это, в сущности, прославленный словарь, который предоставляет доступ
по атрибуту и выдает приличную распечатку. Атрибуты могут свободно
добавляться, изменяться и удаляться.
>>> from types import SimpleNamespace
>>> car1 = SimpleNamespace(цвет='красный',
1
См. документацию Python «types.SimpleNamespace»:
https://docs .python .org/3 .3/library/
types .html
180 Глава 5 • Общие структуры данных Python
... пробег=3812.4,
... автомат=True)
# Метод repr по умолчанию:
>>> car1
namespace(автомат=True, пробег=3812.4, цвет='красный')
# Экземпляры поддерживают атрибутивный доступ и могут изменяться:
>>> car1.пробег = 12
>>> car1.лобовое_стекло = 'треснутое'
>>> del car1.автомат
>>> car1
namespace(лобовое_стекло='треснутое', пробег=12, цвет='красный')
Ключевые
выводы
Итак, какой же тип следует использовать для объектов данных в Python?
Как вы убедились, есть целый ряд различных вариантов для реализации
записей или объектов данных. Как правило, ваше решение будет зависеть
от вашего сценария использования:
Do'stlaringiz bilan baham: