compound_stmts.md
1> **Источник:** https://python-all.ru/3.0/reference/compound_stmts.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Составные инструкции89Составные инструкции содержат (группы) других инструкций; они влияют на выполнение этих других инструкций или управляют им. В общем случае составные инструкции охватывают несколько строк, хотя в простых вариантах вся составная инструкция может помещаться в одну строку.1011Инструкции [`if`](https://python-all.ru/3.0/reference/compound_stmts.html#if), [`while`](https://python-all.ru/3.0/reference/compound_stmts.html#while) и [`for`](https://python-all.ru/3.0/reference/compound_stmts.html#for) реализуют традиционные конструкции управления потоком. [`try`](https://python-all.ru/3.0/reference/compound_stmts.html#try) задаёт обработчики исключений и/или код очистки для группы инструкций, а инструкция [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with) позволяет выполнять код инициализации и завершения вокруг блока. Определения функций и классов также синтаксически являются составными инструкциями.1213Составные инструкции состоят из одной или нескольких «клауз». Клауза состоит из заголовка и «блока». Заголовки клауз одной составной инструкции находятся на одном уровне отступа. Заголовок каждой клаузы начинается с уникального идентифицирующего ключевого слова и заканчивается двоеточием. Блок – это группа инструкций, управляемых клаузой. Блок может состоять из одной или нескольких простых инструкций, разделённых точкой с запятой, на той же строке, что и заголовок, после двоеточия заголовка, или может быть одной или несколькими инструкциями с отступом на следующих строках. Только последняя форма блока может содержать вложенные составные инструкции; следующее недопустимо, в основном потому что было бы неясно, к какой клаузе [`if`](https://python-all.ru/3.0/reference/compound_stmts.html#if) будет относиться следующая клауза [`else`](https://python-all.ru/3.0/reference/compound_stmts.html#else):1415```python16if test1: if test2: print(x)17```1819Также обратите внимание, что в данном контексте точка с запятой связывает сильнее, чем двоеточие, так что в следующем примере выполняются либо все вызовы [`print()`](https://python-all.ru/3.0/library/functions.html#print), либо ни один:2021```python22if x < y < z: print(x); print(y); print(z)23```2425Подводя итог:2627```2829compound_stmt ::= if_stmt30 | while_stmt31 | for_stmt32 | try_stmt33 | with_stmt34 | funcdef35 | classdef36suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT37statement ::= stmt_list NEWLINE | compound_stmt38stmt_list ::= simple_stmt (";" simple_stmt)* [";"]39```4041Обратите внимание, что инструкции всегда заканчиваются `NEWLINE`, за которым может следовать `DEDENT`. Также обратите внимание, что необязательные продолженные секции всегда начинаются с ключевого слова, которое не может начинать инструкцию, поэтому не возникает неоднозначности (проблема «повисающего [`else`](https://python-all.ru/3.0/reference/compound_stmts.html#else)» решается в Python требованием отступа для вложенных инструкций [`if`](https://python-all.ru/3.0/reference/compound_stmts.html#if)).4243Форматирование грамматических правил в следующих разделах помещает каждое предложение на отдельную строку для ясности.4445## Инструкция [`if`](https://python-all.ru/3.0/reference/compound_stmts.html#if)4647Инструкция [`if`](https://python-all.ru/3.0/reference/compound_stmts.html#if) используется для условного выполнения:4849```5051if_stmt ::= "if" expression ":" suite52 ( "elif" expression ":" suite )*53 ["else" ":" suite]54```5556Она выбирает ровно один из блоков, вычисляя выражения по одному, пока одно из них не окажется истинным (см. раздел [*Булевы операции*](https://python-all.ru/3.0/reference/expressions.html#booleans) для определения истинности и ложности); затем этот блок выполняется (и никакая другая часть инструкции [`if`](https://python-all.ru/3.0/reference/compound_stmts.html#if) не выполняется и не вычисляется). Если все выражения ложны, выполняется блок секции [`else`](https://python-all.ru/3.0/reference/compound_stmts.html#else), если она присутствует.5758## Инструкция [`while`](https://python-all.ru/3.0/reference/compound_stmts.html#while)5960Инструкция [`while`](https://python-all.ru/3.0/reference/compound_stmts.html#while) используется для повторного выполнения, пока истинно выражение:6162```6364while_stmt ::= "while" expression ":" suite65 ["else" ":" suite]66```6768Цикл многократно проверяет выражение и, если оно истинно, выполняет первый блок; если выражение ложно (возможно, при первой проверке), выполняется блок секции [`else`](https://python-all.ru/3.0/reference/compound_stmts.html#else), если она присутствует, и цикл завершается.6970Инструкция [`break`](https://python-all.ru/3.0/reference/simple_stmts.html#break), выполненная в первом блоке, завершает цикл без выполнения блока секции [`else`](https://python-all.ru/3.0/reference/compound_stmts.html#else). Инструкция [`continue`](https://python-all.ru/3.0/reference/simple_stmts.html#continue), выполненная в первом блоке, пропускает оставшуюся часть блока и возвращается к проверке выражения.7172## Инструкция [`for`](https://python-all.ru/3.0/reference/compound_stmts.html#for)7374Инструкция [`for`](https://python-all.ru/3.0/reference/compound_stmts.html#for) используется для перебора элементов последовательности (например, строки, кортежа или списка) или другого итерируемого объекта:7576```7778for_stmt ::= "for" target_list "in" expression_list ":" suite79 ["else" ":" suite]80```8182Список выражений вычисляется один раз; он должен возвращать итерируемый объект. Для результата `expression_list` создаётся итератор. Затем блок выполняется один раз для каждого элемента, полученного от итератора, в порядке возрастания индексов. Каждый элемент по очереди присваивается целевому списку с использованием стандартных правил присваивания (см. [*Assignment statements*](https://python-all.ru/3.0/reference/simple_stmts.html#assignment)), после чего блок выполняется. Когда элементы заканчиваются (что происходит немедленно, если последовательность пуста или итератор возбуждает исключение [`StopIteration`](https://python-all.ru/3.0/library/exceptions.html#exceptions.StopIteration)), выполняется блок в клаузе [`else`](https://python-all.ru/3.0/reference/compound_stmts.html#else), если она присутствует, и цикл завершается.8384Выполнение инструкции [`break`](https://python-all.ru/3.0/reference/simple_stmts.html#break) в первом блоке завершает цикл без выполнения блока клаузы [`else`](https://python-all.ru/3.0/reference/compound_stmts.html#else). Выполнение инструкции [`continue`](https://python-all.ru/3.0/reference/simple_stmts.html#continue) в первом блоке пропускает оставшуюся часть блока и продолжает со следующим элементом, или с клаузой [`else`](https://python-all.ru/3.0/reference/compound_stmts.html#else), если следующего элемента не было.8586Блок может присваивать значения переменным в целевом списке; это не влияет на следующий присваиваемый элемент.8788Имена в списке целей не удаляются после завершения цикла, но если последовательность пуста, она вообще не будет присвоена циклом. Подсказка: встроенная функция [`range()`](https://python-all.ru/3.0/library/functions.html#range) возвращает итератор целых чисел, подходящий для имитации эффекта паскалевского `for i := a to b do`; например, `range(3)` возвращает список `[0, 1, 2]`.8990> **Предупреждение**91>92> Есть одна тонкость, когда последовательность изменяется в цикле (это возможно только для изменяемых последовательностей, например, списков). Внутренний счётчик используется для отслеживания того, какой элемент будет использован следующим, и он увеличивается на каждой итерации. Когда счётчик достигает длины последовательности, цикл завершается. Это означает, что если тело цикла удаляет текущий (или предыдущий) элемент из последовательности, следующий элемент будет пропущен (поскольку он получает индекс текущего элемента, который уже был обработан). Аналогично, если тело цикла вставляет элемент перед текущим, то текущий элемент будет обработан снова на следующей итерации. Это может привести к неприятным ошибкам, которых можно избежать, создав временную копию с помощью среза всей последовательности, например,93>94> ```python95> for x in a[:]:96> if x < 0: a.remove(x)97> ```9899## Инструкция [`try`](https://python-all.ru/3.0/reference/compound_stmts.html#try)100101Инструкция [`try`](https://python-all.ru/3.0/reference/compound_stmts.html#try) задаёт обработчики исключений и/или код очистки для группы инструкций:102103```104105try_stmt ::= try1_stmt | try2_stmt106try1_stmt ::= "try" ":" suite107 ("except" [expression ["as" target]] ":" suite)+108 ["else" ":" suite]109 ["finally" ":" suite]110try2_stmt ::= "try" ":" suite111 "finally" ":" suite112```113114Секция(и) [`except`](https://python-all.ru/3.0/reference/compound_stmts.html#except) задают один или несколько обработчиков исключений. Если в секции [`try`](https://python-all.ru/3.0/reference/compound_stmts.html#try) не возникает исключений, ни один обработчик не выполняется. Когда в блоке [`try`](https://python-all.ru/3.0/reference/compound_stmts.html#try) возникает исключение, начинается поиск обработчика исключения. Этот поиск последовательно проверяет секции except, пока не будет найдена подходящая исключению. Секция except без выражения, если присутствует, должна быть последней; она соответствует любому исключению. Для секции except с выражением это выражение вычисляется, и секция соответствует исключению, если полученный объект «совместим» с исключением. Объект совместим с исключением, если он является классом или базовым классом объекта исключения, или кортежем, содержащим элемент, совместимый с исключением.115116Если ни одно предложение except не соответствует исключению, поиск обработчика исключений продолжается в окружающем коде и в стеке вызовов. [\[1\]](https://python-all.ru/3.0/reference/compound_stmts.html#id5)117118Если вычисление выражения в заголовке секции except вызывает исключение, исходный поиск обработчика отменяется и начинается поиск нового исключения в окружающем коде и в стеке вызовов (это обрабатывается так, как если бы всю инструкцию [`try`](https://python-all.ru/3.0/reference/compound_stmts.html#try) вызвало исключение).119120Когда найдена подходящая секция except, исключение присваивается цели, указанной после ключевого слова [`as`](https://python-all.ru/3.0/reference/compound_stmts.html#as) в этой секции except, если оно присутствует, и выполняется блок секции except. Все секции except должны иметь исполняемый блок. Когда конец этого блока достигнут, выполнение продолжается обычным образом после всей инструкции try. (Это означает, что если для одного исключения существуют два вложенных обработчика, и исключение возникает в секции try внутреннего обработчика, внешний обработчик не будет обрабатывать это исключение.)121122Когда исключение было присвоено с помощью `as target`, оно очищается в конце секции except. Это эквивалентно123124```python125except E as N:126 foo127```128129было преобразовано в130131```python132except E as N:133 try:134 foo135 finally:136 N = None137 del N138```139140Это означает, что необходимо присвоить исключение другому имени, если требуется ссылаться на него после блока except. Причина в том, что с прикреплённой трассировкой исключения образуют циклическую ссылку с кадром стека, сохраняя все локальные переменные в этом кадре живыми до следующей сборки мусора.141142Перед выполнением тела блока except сведения об исключении сохраняются в модуле [`sys`](https://python-all.ru/3.0/library/sys.html#module-sys) и доступны через [`sys.exc_info()`](https://python-all.ru/3.0/library/sys.html#sys.exc_info). [`sys.exc_info()`](https://python-all.ru/3.0/library/sys.html#sys.exc_info) возвращает кортеж из трёх элементов: `exc_type` (класс исключения), `exc_value` (экземпляр исключения), `exc_traceback` (объект трассировки, см. раздел [*Стандартная иерархия типов*](https://python-all.ru/3.0/reference/datamodel.html#types)), указывающий на место в программе, где произошло исключение. Значения [`sys.exc_info()`](https://python-all.ru/3.0/library/sys.html#sys.exc_info) восстанавливаются до предыдущих (до вызова) при возврате из функции, обработавшей исключение.143144Необязательная секция [`else`](https://python-all.ru/3.0/reference/compound_stmts.html#else) выполняется, если и когда управление доходит до конца секции [`try`](https://python-all.ru/3.0/reference/compound_stmts.html#try). [\[2\]](https://python-all.ru/3.0/reference/compound_stmts.html#id6) Исключения в секции [`else`](https://python-all.ru/3.0/reference/compound_stmts.html#else) не обрабатываются предшествующими секциями [`except`](https://python-all.ru/3.0/reference/compound_stmts.html#except).145146Если присутствует [`finally`](https://python-all.ru/3.0/reference/compound_stmts.html#finally), он задаёт обработчик «очистки». Выполняется предложение [`try`](https://python-all.ru/3.0/reference/compound_stmts.html#try), включая любые предложения [`except`](https://python-all.ru/3.0/reference/compound_stmts.html#except) и [`else`](https://python-all.ru/3.0/reference/compound_stmts.html#else). Если в каком-либо из этих предложений возникает исключение, и оно не обработано, исключение временно сохраняется. Выполняется предложение [`finally`](https://python-all.ru/3.0/reference/compound_stmts.html#finally). Если есть сохранённое исключение, оно повторно возбуждается в конце предложения [`finally`](https://python-all.ru/3.0/reference/compound_stmts.html#finally). Если предложение [`finally`](https://python-all.ru/3.0/reference/compound_stmts.html#finally) возбуждает другое исключение или выполняет инструкцию [`return`](https://python-all.ru/3.0/reference/simple_stmts.html#return) или [`break`](https://python-all.ru/3.0/reference/simple_stmts.html#break), сохранённое исключение теряется. Информация об исключении недоступна программе во время выполнения предложения [`finally`](https://python-all.ru/3.0/reference/compound_stmts.html#finally).147148Когда инструкция [`return`](https://python-all.ru/3.0/reference/simple_stmts.html#return), [`break`](https://python-all.ru/3.0/reference/simple_stmts.html#break) или [`continue`](https://python-all.ru/3.0/reference/simple_stmts.html#continue) выполняется в блоке [`try`](https://python-all.ru/3.0/reference/compound_stmts.html#try) инструкции [`try`](https://python-all.ru/3.0/reference/compound_stmts.html#try)...[`finally`](https://python-all.ru/3.0/reference/compound_stmts.html#finally), секция [`finally`](https://python-all.ru/3.0/reference/compound_stmts.html#finally) также выполняется «на выходе». Инструкция [`continue`](https://python-all.ru/3.0/reference/simple_stmts.html#continue) недопустима в секции [`finally`](https://python-all.ru/3.0/reference/compound_stmts.html#finally). (Причина – проблема в текущей реализации; это ограничение может быть снято в будущем.)149150Дополнительную информацию об исключениях можно найти в разделе [*Исключения*](https://python-all.ru/3.0/reference/executionmodel.html#exceptions), а информацию об использовании инструкции [`raise`](https://python-all.ru/3.0/reference/simple_stmts.html#raise) для генерации исключений – в разделе [*Инструкция raise*](https://python-all.ru/3.0/reference/simple_stmts.html#raise).151152## Инструкция [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)153154Инструкция [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with) используется для оборачивания выполнения блока методами, определёнными контекстным менеджером (см. раздел [*Контекстные менеджеры инструкции with*](https://python-all.ru/3.0/reference/datamodel.html#context-managers)). Это позволяет инкапсулировать типичные шаблоны использования [`try`](https://python-all.ru/3.0/reference/compound_stmts.html#try)...[`except`](https://python-all.ru/3.0/reference/compound_stmts.html#except)...[`finally`](https://python-all.ru/3.0/reference/compound_stmts.html#finally) для удобного повторного использования.155156```157158with_stmt ::= "with" expression ["as" target] ":" suite159```160161Выполнение инструкции [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with) происходит следующим образом:1621631. Контекстное выражение вычисляется для получения контекстного менеджера.1642. Вызывается метод [`__enter__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__enter__) менеджера контекста.1653. Если в оператор [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with) включена цель, то возвращаемое значение [`__enter__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__enter__) присваивается ей.166167 > **Примечание**168 >169 > Инструкция [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with) гарантирует, что если метод [`__enter__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__enter__) завершается без ошибок, то [`__exit__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__exit__) будет вызван всегда. Таким образом, если ошибка возникает во время присваивания целевому списку, она будет обработана так же, как ошибка, возникающая внутри блока. См. шаг 5 ниже.1704. Выполняется блок.1715. Вызывается метод [`__exit__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__exit__) менеджера контекста. Если из-за исключения был завершён блок, то тип, значение и traceback исключения передаются как аргументы в [`__exit__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__exit__). В противном случае передаются три аргумента [`None`](https://python-all.ru/3.0/library/constants.html#None).172173 Если блок был завершён из-за исключения и возвращаемое значение метода [`__exit__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__exit__) равно false, исключение возбуждается заново. Если возвращаемое значение равно true, исключение подавляется, и выполнение продолжается с оператора, следующего за оператором [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with).174175 Если блок был завершён по любой причине, кроме исключения, возвращаемое значение [`__exit__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__exit__) игнорируется, и выполнение продолжается в обычной точке, соответствующей типу завершения.176177> **См. также**178>179> **[**PEP 0343**](https://python-all.ru/3.0/reference/compound_stmts.html) – оператор «with»**180>181> Спецификация, предыстория и примеры для оператора182>183> [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)184>185> в Python.186187## Определения функций188189Определение функции создаёт объект пользовательской функции (см. раздел [*Стандартная иерархия типов*](https://python-all.ru/3.0/reference/datamodel.html#types)):190191```192193funcdef ::= [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite194decorators ::= decorator+195decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE196dotted_name ::= identifier ("." identifier)*197parameter_list ::= (defparameter ",")*198 ( "*" [parameter] ("," defparameter)*199 [, "**" parameter]200 | "**" parameter201 | defparameter [","] )202parameter ::= identifier [":" expression]203defparameter ::= parameter ["=" expression]204funcname ::= identifier205```206207Определение функции – это исполняемый оператор. Его выполнение связывает имя функции в текущей локальной области видимости с объектом функции (обёрткой над исполняемым кодом функции). Этот объект функции содержит ссылку на текущую глобальную область видимости, которая будет использоваться при вызове функции.208209Определение функции не выполняет тело функции; оно выполняется только при вызове функции. [\[3\]](https://python-all.ru/3.0/reference/compound_stmts.html#id7)210211Определение функции может быть обёрнуто одним или несколькими выражениями [*декоратора*](https://python-all.ru/3.0/glossary.html#term-decorator). Выражения декоратора вычисляются при определении функции в области видимости, содержащей определение функции. Результат должен быть вызываемым объектом, который вызывается с объектом функции в качестве единственного аргумента. Возвращённое значение связывается с именем функции вместо объекта функции. Несколько декораторов применяются вложенным образом. Например, следующий код212213```python214@f1(arg)215@f2216def func(): pass217```218219эквивалентна220221```python222def func(): pass223func = f1(arg)(f2(func))224```225226Когда один или несколько параметров имеют вид *parameter* `=` *expression*, говорят, что функция имеет «значения параметров по умолчанию». Для параметра со значением по умолчанию соответствующий аргумент может быть опущен при вызове, и в этом случае подставляется значение параметра по умолчанию. Если параметр имеет значение по умолчанию, то все последующие параметры до `*` также должны иметь значения по умолчанию – это синтаксическое ограничение, не выраженное в грамматике.227228**Значения параметров по умолчанию вычисляются во время выполнения определения функции.** Это означает, что выражение вычисляется один раз, когда функция определяется, и одно и то же «предварительно вычисленное» значение используется при каждом вызове. Это особенно важно понимать, когда параметр по умолчанию является изменяемым объектом, например списком или словарём: если функция изменяет объект (например, добавляет элемент в список), то значение по умолчанию фактически изменяется. Обычно это не то, что предполагалось. Обойти это можно, используя `None` в качестве значения по умолчанию и явно проверяя его в теле функции, например:229230```python231def whats_on_the_telly(penguin=None):232 if penguin is None:233 penguin = []234 penguin.append("property of the zoo")235 return penguin236```237238Семантика вызова функций подробно описана в разделе [*Вызовы*](https://python-all.ru/3.0/reference/expressions.html#calls). При вызове функции значения присваиваются всем параметрам, перечисленным в списке параметров, либо из позиционных аргументов, либо из именованных аргументов, либо из значений по умолчанию. Если присутствует форма «`*identifier`», она инициализируется кортежем, принимающим все лишние позиционные параметры, по умолчанию – пустой кортеж. Если присутствует форма «`**identifier`», она инициализируется новым словарём, принимающим все лишние именованные аргументы, по умолчанию – новый пустой словарь. Параметры после «`*`» или «`*identifier`» являются только именованными параметрами и могут передаваться только с помощью именованных аргументов.239240Параметры могут иметь аннотации вида «`: выражение`», следующие за именем параметра. Любой параметр может иметь аннотацию, даже параметры вида `*identifier` или `**identifier`. Функции могут иметь аннотацию возврата вида «`-> выражение`» после списка параметров. Эти аннотации могут быть любым допустимым выражением Python и вычисляются при выполнении определения функции. Аннотации могут вычисляться в порядке, отличном от их расположения в исходном коде. Наличие аннотаций не меняет семантику функции. Значения аннотаций доступны как значения словаря, ключами которого являются имена параметров, в атрибуте `__annotations__` объекта функции.241242Также можно создавать анонимные функции (функции, не привязанные к имени) для непосредственного использования в выражениях. Для этого используются лямбда-выражения, описанные в разделе [*Списки выражений*](https://python-all.ru/3.0/reference/expressions.html#lambda). Обратите внимание, что лямбда-выражение – это всего лишь сокращение для упрощённого определения функции; функция, определённая в инструкции «[`def`](https://python-all.ru/3.0/reference/compound_stmts.html#def)», может передаваться или присваиваться другому имени так же, как функция, определённая лямбда-выражением. Форма «[`def`](https://python-all.ru/3.0/reference/compound_stmts.html#def)» на самом деле более мощная, так как позволяет выполнять несколько инструкций и использовать аннотации.243244**Замечание для программиста:** Функции являются объектами первого класса. Форма “`def`”, выполненная внутри определения функции, определяет локальную функцию, которую можно вернуть или передать. Свободные переменные, используемые во вложенной функции, могут обращаться к локальным переменным функции, содержащей определение def. Подробнее см. в разделе [*Именование и связывание*](https://python-all.ru/3.0/reference/executionmodel.html#naming).245246## Определения классов247248Определение класса создаёт объект класса (см. раздел [*Стандартная иерархия типов*](https://python-all.ru/3.0/reference/datamodel.html#types)):249250```251252classdef ::= [decorators] "class" classname [inheritance] ":" suite253inheritance ::= "(" [expression_list] ")"254classname ::= identifier255```256257Определение класса является исполняемой инструкцией. Сначала вычисляется список наследования, если он есть. Каждый элемент списка наследования должен быть классом или типом класса, допускающим наследование. Затем тело класса выполняется в новом кадре выполнения (см. раздел [*Именование и связывание*](https://python-all.ru/3.0/reference/executionmodel.html#naming)) с использованием только что созданного локального пространства имён и исходного глобального пространства имён. (Обычно тело содержит только определения функций.) После завершения выполнения тела класса его кадр выполнения отбрасывается, но локальное пространство имён сохраняется. [\[4\]](https://python-all.ru/3.0/reference/compound_stmts.html#id8) Затем создаётся объект класса с использованием списка наследования для базовых классов и сохранённого локального пространства имён для словаря атрибутов. Имя класса связывается с этим объектом класса в исходном локальном пространстве имён.258259Классы также могут быть декорированы; как и функции,260261```python262@f1(arg)263@f2264class Foo: pass265```266267эквивалентна268269```python270class Foo: pass271Foo = f1(arg)(f2(Foo))272```273274**Примечание программиста:** Переменные, определённые в определении класса, являются переменными класса; они разделяются всеми экземплярами. Переменные экземпляра можно задать в методе с помощью `self.name = value`. Как переменные класса, так и переменные экземпляра доступны через запись «`self.name`», и при таком доступе переменная экземпляра скрывает переменную класса с тем же именем. Переменные класса можно использовать как значения по умолчанию для переменных экземпляра, но использование изменяемых значений может привести к неожиданным результатам. Дескрипторы могут использоваться для создания переменных экземпляра с различными деталями реализации.275276> **См. также**277>278> [**PEP 3129**](https://python-all.ru/3.0/reference/compound_stmts.html) - Декораторы классов279280Определения классов, как и определения функций, могут быть обёрнуты одним или несколькими выражениями [*декоратора*](https://python-all.ru/3.0/glossary.html#term-decorator). Правила вычисления выражений декоратора такие же, как для функций. Результатом должен быть объект класса, который затем связывается с именем класса.281282Сноски283284| [\[1\]](https://python-all.ru/3.0/reference/compound_stmts.html#id1) | Исключение распространяется в стек вызовов только если нет предложения [`finally`](https://python-all.ru/3.0/reference/compound_stmts.html#finally), которое отменяет исключение. |285| --- | --- |286287| [\[2\]](https://python-all.ru/3.0/reference/compound_stmts.html#id2) | В настоящее время управление «достигает конца» за исключением случая возникновения исключения или выполнения инструкции [`return`](https://python-all.ru/3.0/reference/simple_stmts.html#return), [`continue`](https://python-all.ru/3.0/reference/simple_stmts.html#continue) или [`break`](https://python-all.ru/3.0/reference/simple_stmts.html#break). |288| --- | --- |289290| [\[3\]](https://python-all.ru/3.0/reference/compound_stmts.html#id3) | Строковый литерал, находящийся в качестве первого оператора в теле функции, преобразуется в атрибут `__doc__` функции и, следовательно, в [*докстринг*](https://python-all.ru/3.0/glossary.html#term-docstring) функции. |291| --- | --- |292293| [\[4\]](https://python-all.ru/3.0/reference/compound_stmts.html#id4) | Строковый литерал, находящийся в качестве первого оператора в теле класса, преобразуется в элемент `__doc__` пространства имён и, следовательно, в [*докстринг*](https://python-all.ru/3.0/glossary.html#term-docstring) класса. |294| --- | --- |295