Python:怎样通过阅读名字 “人眼” 判断其为对象的属性还是方法( 二 )


2. 访问对象的元数据
当你对一个你构造的对象使用dir()时,可能会发现列表中的很多属性并不是你定义的。这些属性一般保存了对象的元数据,比如类的__name__属性保存了类名。大部分这些属性都可以修改,不过改动它们意义并不是很大;修改其中某些属性如function.func_code还可能导致很难发现的问题,所以改改name什么的就好了,其他的属性不要在不了解后果的情况下修改。
【Python:怎样通过阅读名字 “人眼” 判断其为对象的属性还是方法】 接下来列出特定对象的一些特殊属性。另外,Python的文档中有提到部分属性不一定会一直提供,下文中将以红色的星号*标记,使用前你可以先打开解释器确认一下。2.0. 准备工作:确定对象的类型
在types模块中定义了全部的Python内置类型,结合内置方法isinstance()就可以确定对象的具体类型了。
isinstance(object, classinfo): 检查object是不是classinfo中列举出的类型,返回布尔值。classinfo可以是一个具体的类型,也可以是多个类型的元组或列表。
types模块中仅仅定义了类型,而inspect模块中封装了很多检查类型的方法,比直接使用types模块更为轻松,所以这里不给出关于types的更多介绍,如有需要可以直接查看types模块的文档说明。本文第3节中介绍了inspect模块。2.1. 模块(module)
__doc__: 文档字符串。如果模块没有文档,这个值是None。 *__name__: 始终是定义时的模块名;即使你使用import .. as 为它取了别名,或是赋值给了另一个变量名。 *__dict__: 包含了模块里可用的属性名-属性的字典;也就是可以使用模块名.属性名访问的对象。 __file__: 包含了该模块的文件路径。需要注意的是内建的模块没有这个属性,访问它会抛出异常!
?12345import fnmatch as mprint m.__doc__.splitlines() # Filename matching with shell patterns.print m.__name__ # fnmatchprint m.__file__ # /usr/lib/python2.6/fnmatch.pycprint m.__dict__.items() # (\u0026#39;fnmatchcase\u0026#39;, \u0026lt;function fnmatchcase="" at="" 0xb73deb54=""\u0026gt;)\u0026lt;/function\u0026gt;
2.2. 类(class)
__doc__: 文档字符串。如果类没有文档,这个值是None。 *__name__: 始终是定义时的类名。 *__dict__: 包含了类里可用的属性名-属性的字典;也就是可以使用类名.属性名访问的对象。 __module__: 包含该类的定义的模块名;需要注意,是字符串形式的模块名而不是模块对象。 *__bases__: 直接父类对象的元组;但不包含继承树更上层的其他类,比如父类的父类。
?12345print Cat.__doc__ # Noneprint Cat.__name__ # Catprint Cat.__module__ # __main__print Cat.__bases__ # (\u0026lt;type ?object?=""\u0026gt;,)print Cat.__dict__ # {\u0026#39;__module__\u0026#39;: \u0026#39;__main__\u0026#39;, ...}\u0026lt;/type\u0026gt;
2.3. 实例(instance)
实例是指类实例化以后的对象。
*__dict__: 包含了可用的属性名-属性字典。 *__class__: 该实例的类对象。对于类Cat,cat.__class__ == Cat 为 True。
?123print cat.__dict__print cat.__class__print cat.__class__ == Cat # True
2.4. 内建函数和方法(built-in functions and methods)
根据定义,内建的(built-in)模块是指使用C写的模块,可以通过sys模块的builtin_module_names字段查看都有哪些模块是内建的。这些模块中的函数和方法可以使用的属性比较少,不过一般也不需要在代码中查看它们的信息。
__doc__: 函数或方法的文档。 __name__: 函数或方法定义时的名字。 __self__: 仅方法可用,如果是绑定的(bound),则指向调用该方法的类(如果是类方法)或实例(如果是实例方法),否则为None。 *__module__: 函数或方法所在的模块名。


推荐阅读