我是初学者。在这里学习。
一段代码抛出了一个WindowsError。我抓住它并将其重命名为exception
。
我通过dir(exception)
,type(exception)
,print(exception.__dict__)
内省了对象,尝试查找运行某些文档命令的引用:例如:帮助(areference)`。
我无法找到定义WindowsError的位置。我试过help(os.WindowsError)
,但这显然导致无处可去。
最终的目的是确定WindowsError的来源,但是对于这个问题,因为我以某种方式得到了Google的答案,我想学习如何通过Python命令找到它。
具体做法是:
我内省错了吗?有更好的方法吗?
答案 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允许多重继承,因此无法定义“超类”的概念。每个类可以有多个父类,并且层次结构可以变成一个非常复杂的图形,并且试图考虑超类只会导致陷阱(例如,当子类重新定义签名等时,对方法的调用失败)