以下是python documentation处理异常处理和类的代码示例。我正在努力理解这两个,我的背景是Java,所以我习惯强类型和变量。有人请详细解释这里发生了什么吗?
class B:
pass
class C(B):
pass
class D(C):
pass
for c in [B, C, D]:
try:
raise c()
except D:
print "D"
except C:
print "C"
except B:
print "B"
前六行是否实际创建了B,C和D的实例,或者只创建了一个类类型。如果它们只是类类型,我认为它们是在for c in [B, C, D]:
中实现的。如何在没有参数的情况下实例化C类和D类的实例?那么异常的东西是怎么回事?
答案 0 :(得分:1)
前六行定义了类。它们在没有参数的情况下被实例化,例如class C(B):
表示类C
从B
继承,而不是C
的实例化需要传递参数。这在documentation on classes。
每次循环时,解释器都会引发给定类的错误。它将打印引发的任何类型的异常类,B
用于B
,依此类推。正如您在运行该代码时看到的那样,输出为B
,然后是C
,然后是D
,因为这些是按顺序引发的异常类,就像您一样请参阅循环迭代的[B, C, D]
。
答案 1 :(得分:1)
前六行创建类。我喜欢将它们视为稍后将创建的实例的定义。使用for c in [B, C, D]:
不实例化任何内容;它只是为c
,B
和C
分配D
,它们仍然只是类。对于第一次迭代,c
与B
相同。因此,当您说raise c()
时,c()
会生成B
的实例并将其作为例外引发。该异常在except B:
块中捕获并导致print "B"
行执行。对于下一次迭代,c
被分配到[B, C, D]
:C
中的下一个值。现在,raise c()
生成C
的实例并将其作为例外引发。该异常在except C:
块中捕获,并执行print "C"
行。同样的事情发生在D
。
答案 2 :(得分:0)
前六行正在创建类类型。
因为python中的所有内容都可以分配给变量,所以这包括函数,类(不仅仅是该类的实例化对象)for c in [B, C, D]:
正在执行的操作。
最后,try:
中的异常首先通过创建它的实例来尝试引发类型c
的异常。因此,它首先引发类型B的异常,然后键入C,然后键入D.
except
用于捕获每种类型的异常。在python 2中,任何对象都可以作为异常引发,这与python 3不同,其中引发的所有异常必须从类型BaseException派生