Б41 Чистый Python. Тонкости программирования для профи. Спб.: Питер



Download 6,94 Mb.
Pdf ko'rish
bet56/80
Sana24.02.2022
Hajmi6,94 Mb.
#212875
1   ...   52   53   54   55   56   57   58   59   ...   80
Bog'liq
978544610803 Chisty Python Tonko

# Экземпляры имеют хороший метод repr: 
>>> car1 Авто(цвет='красный', пробег=3812.4, автомат=True) 
# Доступ к полям: 
>>> car1.пробег 
3812.4 
# Поля неизменяемы:
>>> car1.пробег = 12 
AttributeError: "can't set attribute" 
>>> car1.лобовое_стекло = 'треснутое' 
AttributeError: 
"'Car' object has no attribute 'лобовое_стекло'"
typing .NamedTuple — усовершенствованные 
именованные кортежи
Этот класс был добавлен в Python 3.6 и является младшим братом класса 
namedtuple
в модуле 
collections
1
. Он очень похож на 
namedtuple
, и его 
главное отличие состоит в том, что у него есть обновленный синтаксис для 
определения новых типов записей и добавленная поддержка подсказок 
при вводе исходного кода.
Кроме того, обратите внимание, что сигнатуры типов не поддерживаются 
без отдельного инструмента проверки типов, такого как mypy
2
. Но даже 
без инструментальной поддержки они могут предоставлять полезные под-
сказки для других программистов (или могут быть ужасно запутанными, 
если подсказки в отношении типов становятся устаревшими).
>>> from typing import NamedTuple 
class Car(NamedTuple):
цвет: str
пробег: float
автомат: bool 
1
См. документацию Python «typing.NamedTuple»: 
https://docs .python .org/3 .6/library/typing .
html
2
См. mypy-lang.org


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? 
Как вы убедились, есть целый ряд различных вариантов для реализации 
записей или объектов данных. Как правило, ваше решение будет зависеть 
от вашего сценария использования:

Download 6,94 Mb.

Do'stlaringiz bilan baham:
1   ...   52   53   54   55   56   57   58   59   ...   80




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish