14.1可调用对象
Python有四种可调用对象(可以通过函数操作符‘()’来调用的对象):函数、方法、类、类的实例
14.1.1函数
1.内建函数(BIF)
内建函数是用C/C++写的,编译过后放入Python解释器,然后把它们作为第一名称空间的一部分加载进系统。如之前章节所述,这些函数在_bulitin_模块里,并作为__builtins__模块导入到解释器中
属性 | 描述 |
bif.__doc__ | 文档字符串(或None) |
bif.__name__ | 字符串类型的文档名字 |
bif.__self__ | 设置为None(保留给内建方法) |
bif.__module__ | 存放bif定义的模块名字(或None) |
可以用dir()列出函数的所有属性
>>> dir(type)
[‘__abstractmethods__‘, ‘__base__‘, ‘__bases__‘, ‘__basicsize__‘, ‘__call__‘, ‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__dictoffset__‘, ‘__doc__‘, ‘__eq__‘, ‘__flags__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__instancecheck__‘, ‘__itemsize__‘, ‘__le__‘, ‘__lt__‘, ‘__module__‘, ‘__mro__‘, ‘__name__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasscheck__‘, ‘__subclasses__‘, ‘__subclasshook__‘, ‘__weakrefoffset__‘, ‘mro‘]
从内部机制来看,因为内建函数和内建方法属于相同的类型,所以对BIF或者BIM调用type()的结果是
>>> type(dir)
<type ‘builtin_function_or_method‘>
注意这不能应用于工厂函数,因为type()正好会返回产生对象的类型
2.用户定义的函数(UDF)
用户定义的函数通常是用Python写的,定义在模块的最高级,因此会作为全局名称空间的一部分装载到系统中。函数也可以在其他函数体内定义,并且由于在2.2中嵌套作用域的改进,我们现在可以对多重嵌套作用域中的属性进行访问。可以用func_closure属性来勾住在其他地方定义的属性。
UDF也有许多属性,其中最特殊和最令人感兴趣的属性列表如下
属性 | 描述 |
udf.__doc__ | 文档字符串,也可以用udf.func_doc |
udf.__name__ | 字符串类型的函数名字,也可以用udf.func_name |
udf.func_code | 字节编译的代码对象 |
udf.func_defaults | 默认的参数元组 |
udf.func_globals | 全局名称空间字典;和从函数内部调用globals(x)一样 |
udf.func_dict | 函数属性的名称空间 |
udf.func_doc | (见上面的udf.__doc__) |
udf.func_name | (见上面的udf.__name__) |
udf.func_closure | 包含了自由变量的引用的单元对象元组(自用变量在UDF中使用,但在别处定义) |
3.lambda表达式
通过lambda来创建函数的对象除了没有命名之外,享有和用户自定义函数相同的属性,__name__或者func_name属性给定为字符串"<lambda>"。
14.1.2方法
1.内建方法
对于内建方法,type()工厂函数给出了和内建函数相同的输出。此外,内建方法和内建函数两者也享有相同属性,不同之处在于内建方法的__self__属性指向一个Python对象,而内建函数指向None。
对于类和实例都可以通过dir来获取方法属性,对于内建方法也是如此。
2.用户定义的方法(UDM)
用户定义的方法包含在类定义之中,只是拥有标准函数的包装,仅有定义它们的类可以使用。如果没有在子类定义中被覆盖掉,也可以通过子类实例来调用它们。正如13章中解释的,UDM与类对象是关联的(非绑定方法),但是只能通过类的实例来调用(绑定方法)。
属性 | 描述 |
udm.__doc__ | 文档字符串(与udm.im_fuc.__doc__相同) |
udm.__name__ | 字符串类型的方法名字(与udm.im_fuc.__name__相同) |
udm.__module__ | 定义udm的模块的名字(或None |
udm.im_class | 方法相关联的类(如果是非绑定,那么为要求是udm的类 |
udm.im_func | 方法的函数对象 |
udm.im_self | 如果绑定的话为相关联的实例,否则为None |
14.1.3 类