WindowsError在哪里定义?

时间:2013-02-21 14:30:31

标签: python

我是初学者。在这里学习。

一段代码抛出了一个WindowsError。我抓住它并将其重命名为exception

我通过dir(exception)type(exception)print(exception.__dict__)内省了对象,尝试查找运行某些文档命令的引用:例如:帮助(areference)`。

我无法找到定义WindowsError的位置。我试过help(os.WindowsError),但这显然导致无处可去。

最终的目的是确定WindowsError的来源,但是对于这个问题,因为我以某种方式得到了Google的答案,我想学习如何通过Python命令找到它。

具体做法是:

  • 获取定义类型的模块
  • 获取我在异常中获得的类的超类型(甚至...... 任何类?!)

我内省错了吗?有更好的方法吗?

2 个答案:

答案 0 :(得分: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()来获取类型。

答案 1 :(得分: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允许多重继承,因此无法定义“超类”的概念。每个类可以有多个父类,并且层次结构可以变成一个非常复杂的图形,并且试图考虑超类只会导致陷阱(例如,当子类重新定义签名等时,对方法的调用失败)