好奇,为什么以下代码
import sys
class F(Exception):
sys.stderr.write('Inside exception\n')
sys.stderr.flush()
pass
sys.stderr.write('Before Exception\n')
sys.stderr.flush()
try:
raise F
except F:
pass
输出:
Inside exception
Before Exception
而不是:
Before exception
Inside Exception
答案 0 :(得分:8)
您在课程中打印,而不是在初始化块中打印。试试这个
import sys
class F(Exception):
sys.stderr.write('Inside exception\n')
sys.stderr.flush()
pass
单独。即,当你拨打raise F
时,它没有运行。试试这个
import sys
class F(Exception):
def __init__():
sys.stderr.write('Inside exception\n')
sys.stderr.flush()
raise new F()
答案 1 :(得分:1)
正如Sven所说,在执行类定义时会立即执行类主体。
在您的代码中,您对类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类的实例。
答案 2 :(得分:0)
你在班级有陈述:
class F(Exception):
sys.stderr.write('Inside exception\n')
考虑这一点,在创建对象实例之前不会执行:
class F(Exception):
def __init__(self):
sys.stderr.write('Inside exception\n')