【python学习】之五、可调用对象

在python中有四种可调用对象:函数,方法,类,类的实例


1、函数

(1)内建函数(BIF    Built-in Function):   用C/C++来写的,在__bulitin__模块里,并作为__builtin__模块导入到解释器中去!

>>> 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__', '__prepare__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasscheck__', '__subclasses__', '__subclasshook__', '__weakrefoffset__', 'mro']
>>> type(dir)
<class 'builtin_function_or_method'>

通过代码可以知道,dir()可以列出函数的多有属性。

type()返回产生对象的类型!



(2)用户自定义函数(UDF User-Defined Function)  是用python写的,他定义在模块的最高级!

从内部机制看,用户自定义函数是”函数“类型的。

>>> def a():
	pass

>>> type(a)
<class 'function'>


(3)lambda表达式   这里和自定义函数有所不同,这里不是用def创建的函数,而是用lambda关键字!

>>> b = lambda x: x * x
>>> b(10)
100
>>> type(b)
<class 'function'>
>>> a.__name__
'a'
>>> b.__name__
'<lambda>'



2、方法

(1)内建方法(BIM built-in Method)     只有内建类型才有内建方法,

>>> type([].append)
<class 'builtin_function_or_method'>
>>> [].append
<built-in method append of list object at 0x02758148>
type函数给出了和BIF一样的输出。


我们再来看一下内建函数作用到内建方法上:dir()

>>> dir([].append)
['__call__', '__class__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']


(2)用户定义的方法(UDM  User-defined method) 他包含在类定义中。只是拥有标准函数的包装,仅有定义它们的类可以使用。子类中如果不覆盖那么也可以使用!

>>> class C(object):        #类
	def a(self):        #UDM
		pass

	
>>> c = C()        #实例化
>>> type(c)         #实例的类别
<class '__main__.C'> 
>>> type(C)           #类的类别
<class 'type'>
>>> type(c.a)    #绑定方法的类别
<class 'method'>
>>> type(C.a)      #非绑定方法的类别
<class 'function'>

3、类

这里不多说了


4、类的实例

在python中提供了一个__call__的特别方法,这个方法允许程序员城建可调用的对象(实例)。

如:a() 和 a.__call__(a)的效果是相同的。 如果__call__有参数,__call__(self, a)那么调用就会像这样:a(b)  == a.__call__(a, b)!!

>>> class C(object):
	def __call__(self, *args):
		print 'a:\n', args

		
>>> c = C()      #实例化
>>> c
<__main__.C object at 0x025F2ED0>
>>> callable(c)       #检测实例是否可调用
True
>>> c()        #调用实例
a:
()
>>> c(1)
a:
(1,)



2012/8/7

jofranks 于南昌

原文地址:https://www.cnblogs.com/java20130723/p/3211422.html