Python中函数与方法的区别?
滴滴,老Amy来啦之前做开发的时候,一直忙着赶项目,活脱脱的就是一个秉持着“能用就行原则”的工具人[哭了],至于那颗充满十万个为什么的好奇心直接被忽略各位请细品,如果老Amy直接在公司要问领导“为什么同样是 def 定义,会有函数与方法两个名称?”,暴脾气的领导还不跳起来给我两下?
这我也理解,毕竟这个问题这么问,大家肯定会向我投来同情的目光并且告诉我:“啥~定义在类里的函数叫方法,晓得不?臭Amy”,emm…我就在想,这句话有据可依嘛?于是鲁迅上身:“从来如此,便对吗?”
于是乎,今天老Amy就来跟大家一起唠唠这方法与函数“背后的故事”~
前身
Python中的 inspect 模块,提供了一系列的对对象进行类型检查的函数,其中可以看到 ismethod() 与 isfunction() 函数,就是用来判断什么是方法(method),什么是函数(funtion)的
首先来举个栗子,我们直接定义一个函数test,使用 ismethod() 与 isfunction() 验证 test 是方法还是函数,还是…成年人的世界我都要?
In [1]: import inspect
In [2]: def test():
...: print("welcome...")
...:
In [3]: inspect.ismethod(test)
Out[3]: False
In [4]: inspect.isfunction(test)
Out[4]: True
运行的结果分别是 False 和 True,说明这是一个函数而不是一个方法…emmm…那有的朋友就会说,这不跟我想的一样嘛?那我们在命令行中来看看这两个函数的源码
ismethod真相
ismethod() 判断出的是实例方法(instance method) ,最主要的是,它包含__self__
属性
But…类的内部定义的方法全都是真正意义上的方法(MethodType)吗?
- 当没有创建实例时,实例方法以及静态方法都不算作MethodType
In [16]: class Demo(object):
...: def ins_func(self):
...: pass
...:
...: @classmethod
...: def cls_func(cls):
...: pass
...:
...: @staticmethod
...: def sta_func():
...: pass
...:
In [17]: inspect.ismethod(Demo.ins_func)
Out[17]: False
In [18]: inspect.ismethod(Demo.cls_func)
Out[18]: True
In [19]: inspect.ismethod(Demo.sta_func)
Out[19]: False
- 当创建实例后,实例方法就成为了MethodType,但是静态方法仍然不是。
In [20]: d = Demo()
In [21]: inspect.ismethod(d.ins_func)
Out[21]: True
In [22]: inspect.ismethod(d.cls_func)
Out[22]: True
In [23]: inspect.ismethod(d.sta_func)
Out[23]: False
isfunction真相
看到 isfuntion() 所检测的是用户自定义函数(a user-defined function),我又开始揣测,我们使用过那么多的Python内置函数,比如:len() 、range() 、 map()…都是啥?
- 首先,它们的类型不是 function
In [7]: inspect.isfunction(len)
Out[7]: False
In [8]: inspect.isfunction(range)
Out[8]: False
In [9]: inspect.isfunction(map)
Out[9]: False
- 实际上,一般的内置函数的类型都是 builtin_function_or_method
In [10]: type(len)
Out[10]: builtin_function_or_method
仅此而已吗?我们需要注意的是 range() 、 map() 等都只是看起来像函数…实际上,看图,它们都属于 type
In [11]: type(range)
Out[11]: type
In [12]: type(map)
Out[12]: type
这是为啥呢?来看看官网说明文档
上图可以看到,Built-in Functions 里面不仅仅只有 functions (内置函数),还有types (内置类)。也就是说,range(),map() 都是类~
“我擦…不会吧!咋整的全民误会?”,很有必要的去看了看python2的说明文档
这样就很好理解了,官方在python3已经修正了python2的定义,但是我们已经习惯了全部都叫函数了呀~所以,就有了这些模棱两可的叫法。
到这里老Amy好像有点晕车了必须附上偶像的表情hhhhh,简单的给大家做个总结叭~
总结
方法
- 实例前:只有类方法才是MethodType,而实例方法与静态方法都不是。
- 实例后:类方法与实例方法都是MethodType,而静态方法不是。
函数
- 用户自定义函数可通过 aspect.isfunction() 来验证
- Built-in Functions 包含 functions(内置函数)以及types(内置类)。
如:type(len) 是 builtin_function_or_method,type(range) 则是 type。
今日鸡汤
今天的鸡汤有点狠,但是我们都要在快生活[emmm…]当中找到平静又有力量的自己,谢谢你看到这里啦,不防再来个在看与关注叭~笔芯
上一篇: 什么是分布式锁
下一篇: 什么是 TCC分布式事务?