我一直在寻找一些对某些人来说相对愚蠢的东西,但对我来说非常有趣!:-)
输入和输出错误已OSError在Python 3.3中合并,因此异常类层次结构发生了变化.关于内建类的一个有趣的特点OSError是,它通过时返回它的一个子类errno和strerror
>>> 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 ×1