WindowsError在哪里定义?
我还是个初学者,来这里学习。
有一段代码抛出了一个WindowsError错误。我捕获了这个错误,并把它重命名为exception
。
我想了解这个对象的更多信息,所以通过dir(exception)
、type(exception)
和print(exception.__dict__)
来查看,想找到一些可以用来查看文档的参考,比如用help(areference)
。
但是我找不到WindowsError是在哪里定义的。我试过用help(os.WindowsError)
,但这显然没有帮助。
我最终想知道WindowsError是从哪里来的,不过这次问题的答案我在谷歌上找到了,我想学习如何通过Python命令来找到这个信息。
具体来说:
- 获取一个类型定义所在的模块
- 获取我在异常中得到的类的超类(或者说... 任何类?!)
我是不是在查看信息的方式上做错了?有没有更好的方法?
2 个回答
问题 1: 类型定义在哪个模块中
在我的 Python 中,这个类型是在一个叫做 exceptions
的内置模块里定义的:
>>> WindowsError
<type 'exceptions.WindowsError'>
你可以通过查看一个类型的 __module__
属性,来程序化地找到这个类型定义在哪个模块里:
>>> WindowsError.__module__
'exceptions'
>>> sys.modules[WindowsError.__module__]
<module 'exceptions' (built-in)>
问题 2: 如何找到一个类型的父类
一个类型的 __bases__
属性列出了它的所有父类。
>>> WindowsError.__bases__
(<type 'exceptions.OSError'>,)
问题 3: 给定对象的类型是什么
你其实没有问这个问题,但你的评论表明你应该问。要找出一个对象的类型,可以使用 type()
函数。
>>> i = 666
>>> type(i)
<type 'int'>
>>> type(i).__bases__
(<type 'object'>,)
>>> type(i).__module__
'__builtin__'
所以,当你捕获一个异常时,你得到的是一个对象,而不是类型,也就是说你得到了这个类的一个实例。要了解这个对象的类型,你必须先用 type()
来获取它的类型。
你可能想看看 inspect
这个模块。特别是里面的 inspect.getmodule
函数。
如果你想获取一个类的父类,可以直接查看这个类的 __bases__
属性:
>>> IOError.__bases__
(<type 'exceptions.EnvironmentError'>,)
或者你可以通过 __mro__
属性来获取类的层级结构:
>>> IOError.__mro__
(<type 'exceptions.IOError'>, <type 'exceptions.EnvironmentError'>, <type 'exceptions.StandardError'>, <type 'exceptions.Exception'>, <type 'exceptions.BaseException'>, <type 'object'>)
__mro__
告诉你 Python 在类的层级中查找方法和属性的顺序。
需要注意的是,由于 Python 允许多重继承,所以你不能简单地定义“超类”的概念。每个类可以有多个父类,这样层级结构可能会变得相当复杂,试图去理解超类只会让你陷入困境(比如,当子类重新定义方法签名时,调用方法可能会失败等等)。