WindowsError在哪里定义?

3 投票
2 回答
2158 浏览
提问于 2025-04-17 16:38

我还是个初学者,来这里学习。

有一段代码抛出了一个WindowsError错误。我捕获了这个错误,并把它重命名为exception

我想了解这个对象的更多信息,所以通过dir(exception)type(exception)print(exception.__dict__)来查看,想找到一些可以用来查看文档的参考,比如用help(areference)

但是我找不到WindowsError是在哪里定义的。我试过用help(os.WindowsError),但这显然没有帮助。

我最终想知道WindowsError是从哪里来的,不过这次问题的答案我在谷歌上找到了,我想学习如何通过Python命令来找到这个信息。

具体来说:

  • 获取一个类型定义所在的模块
  • 获取我在异常中得到的类的超类(或者说... 任何类?!)

我是不是在查看信息的方式上做错了?有没有更好的方法?

2 个回答

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() 来获取它的类型。

2

你可能想看看 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 允许多重继承,所以你不能简单地定义“超类”的概念。每个类可以有多个父类,这样层级结构可能会变得相当复杂,试图去理解超类只会让你陷入困境(比如,当子类重新定义方法签名时,调用方法可能会失败等等)。

撰写回答