Как правильно сказал Свен, тела классов выполняются сразу же, когда выполняется определение класса.
В вашем коде ваше определение класса F находится выше этой команды sys.stderr.write('Before Exception\n')
, и, следовательно, sys.stderr.write('Inside exception\n')
получаетвыполняется первым и, следовательно, его вывод виден первым.
В качестве теста запустите эту программу -
import sys
sys.stderr.write('Before Exception\n')
sys.stderr.flush()
class F(Exception):
sys.stderr.write('Inside exception\n')
sys.stderr.flush()
pass
try:
raise F
except F:
pass
Теперь вы получите следующее сообщение:
Before exception
Inside Exception
Это просто потому, что оператор sys.stderr.write('Before Exception\n')
получаетвыполняется до того, как определение класса будет выполнено.
Фактически, печать Inside Exception
не имеет ничего общего с инициализацией экземпляра F (с помощью raise
).Он будет напечатан независимо от того, инициализируете ли вы экземпляр F или нет.
Попробуйте это -
import sys
class F(Exception):
sys.stderr.write('Inside exception\n')
sys.stderr.flush()
pass
Тем не менее вы получите этот вывод -
Inside Exception
, хотя вы не сделали экземпляр класса F.