相关疑难解决方法(0)

返回OSError异常类子类实例的逻辑在哪里?

我一直在寻找一些对某些人来说相对愚蠢的东西,但对我来说非常有趣!:-)

输入和输出错误已OSError在Python 3.3中合并,因此异常类层次结构发生了变化.关于内建类的一个有趣的特点OSError是,它通过时返回它的一个子类errnostrerror

>>> OSError(2, os.strerror(2))
FileNotFoundError(2, 'No such file or directory')

>>> OSError(2, os.strerror(2)).errno
2
>>> OSError(2, os.strerror(2)).strerror
'No such file or directory'
Run Code Online (Sandbox Code Playgroud)

正如你可以看到传递errno和返回实例strerror的构造函数,它是一个子类.OSErrorFileNotFoundErrorOSError

Python Doc:

构造函数实际上经常返回OSError的子类,如下面的OS 异常中所述.特定的子类取决于最终的errno值.此行为仅在直接构造OSError或通过别名构造时发生,并且在子类化时不会继承.

我想编写一个以这种方式运行的子类.这主要是好奇心,而不是现实世界的代码.我也试图知道,创建子类对象的逻辑在哪里__new__,例如它编码?如果__new__包含用于创建子类实例的逻辑,则继承OSError通常会返回此行为,除非存在某种类型的检查__new__:

>>> class A(OSError): pass 
>>> A(2, os.strerror(2))
A(2, 'No such file or directory')
Run Code Online (Sandbox Code Playgroud)

必须进行类型检查:

# If passed OSError, returns subclass instance
>>> A.__new__(OSError, 2, os.strerror(2))         
FileNotFoundError(2, …
Run Code Online (Sandbox Code Playgroud)

python

9
推荐指数
2
解决办法
304
查看次数

标签 统计

python ×1