分析有异常的工作,我遇到了这种情况。我们举一个例子,通过资料和教科书以不同的形式走:
class UppercaseException(Exception):
pass
words = ['я', 'ты', 'он', 'ОНА', 'оно']
for word in words:
if word.isupper():
raise UppercaseException (word)
结果是预期的:
Traceback (most recent call last):
File "<ipython-input-54-fc1eb7bb7c0c>", line 4, in <module>
raise UppercaseException (word)
UppercaseException: ОНА
我进入类构造函数。万一我以后需要在其中进行一些处理,我输入一个新属性的定义:
class UppercaseException ( Exception ):
def __init__(self, ar):
print ('Обработка исключений')
self.atr = ar
return
words = ['я', 'ты', 'он', 'ОНА', 'оно']
for word in words:
if word.isupper():
raise UppercaseException (word)
结果与上一个几乎相同:
Обработка исключений
Traceback (most recent call last):
File "<ipython-input-55-b239d3ebd306>", line 10, in <module>
raise UppercaseException (word)
UppercaseException: ОНА
虽然一切都很清楚和预期。现在 -实际上是一个问题。我更改属性名称:
class UppercaseException ( Exception ):
def __init__(self, ar):
print ('Обработка исключений')
self.args = ar
return
words = ['я', 'ты', 'он', 'ОНА', 'оно']
for word in words:
if word.isupper():
raise UppercaseException (word)
结果发生了巨大变化!
Обработка исключений
Traceback (most recent call last):
File "<ipython-input-56-6460513f725f>", line 9, in <module>
raise UppercaseException (word)
UppercaseException: ('О', 'Н', 'А')
为了便于分析,我在构造函数内部推导了类型(嗯,一路上——值本身)
class UppercaseException ( Exception ):
def __init__(self, ar):
print ('Входной параметр: ', type(ar),ar)
self.args = ar
print ('Атрибут класса: ', type(self.args),self.args)
return
words = ['я', 'ты', 'он', 'ОНА', 'оно']
for word in words:
if word.isupper():
raise UppercaseException (word)
注意类型是如何定义的:
Входной параметр: <class 'str'> ОНА
Атрибут класса: <class 'tuple'> ('О', 'Н', 'А')
Traceback (most recent call last):
File "<ipython-input-64-448db16a8ad8>", line 10, in <module>
raise UppercaseException (word)
UppercaseException: ('О', 'Н', 'А')
我什至可以假设它与该类UppercaseException继承自Exception. 但这应该不会影响被覆盖属性的类型,即使父类的构造函数被显式(!)调用(使用隐式调用,情况也类似):
class A:
def __init__(self, a):
self.args = tuple(a)
print("class A: ",self.args,type(self.args))
class B(A):
def __init__(self, a):
super().__init__( a)
print("Параметр a :",a,type(a))
self.args = a
print("class B: ",self.args,type(self.args))
b=B('qwerty')
结果:
class A: ('q', 'w', 'e', 'r', 't', 'y') <class 'tuple'>
Параметр a : qwerty <class 'str'>
class B: qwerty <class 'str'>
类型,因为它是字符串,仍然如此,即 有一个重新定义。正如预期的那样。
也许有人处理过这个问题,或者至少对处理异常时会发生什么以及为什么会发生一些猜测?