欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python中函数与方法的区别?

程序员文章站 2022-05-07 21:46:39
...

滴滴,老Amy来啦之前做开发的时候,一直忙着赶项目,活脱脱的就是一个秉持着“能用就行原则”的工具人[哭了],至于那颗充满十万个为什么的好奇心直接被忽略各位请细品,如果老Amy直接在公司要问领导“为什么同样是 def 定义,会有函数与方法两个名称?”,暴脾气的领导还不跳起来给我两下?

这我也理解,毕竟这个问题这么问,大家肯定会向我投来同情的目光并且告诉我:“啥~定义在类里的函数叫方法,晓得不?臭Amy”,emm…我就在想,这句话有据可依嘛?于是鲁迅上身:“从来如此,便对吗?”

于是乎,今天老Amy就来跟大家一起唠唠这方法与函数“背后的故事”~

前身

Python中的 inspect 模块,提供了一系列的对对象进行类型检查的函数,其中可以看到 ismethod() 与 isfunction() 函数,就是用来判断什么是方法(method),什么是函数(funtion)的
Python中函数与方法的区别?
首先来举个栗子,我们直接定义一个函数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…那有的朋友就会说,这不跟我想的一样嘛?那我们在命令行中来看看这两个函数的源码
Python中函数与方法的区别?
Python中函数与方法的区别?

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

这是为啥呢?来看看官网说明文档
Python中函数与方法的区别?
上图可以看到,Built-in Functions 里面不仅仅只有 functions (内置函数),还有types (内置类)。也就是说,range(),map() 都是类~

“我擦…不会吧!咋整的全民误会?”,很有必要的去看了看python2的说明文档
Python中函数与方法的区别?
这样就很好理解了,官方在python3已经修正了python2的定义,但是我们已经习惯了全部都叫函数了呀~所以,就有了这些模棱两可的叫法。

到这里老Amy好像有点晕车了必须附上偶像的表情hhhhh,简单的给大家做个总结叭~

总结

方法
  • 实例前:只有类方法才是MethodType,而实例方法与静态方法都不是。
  • 实例后:类方法与实例方法都是MethodType,而静态方法不是。
函数
  • 用户自定义函数可通过 aspect.isfunction() 来验证
  • Built-in Functions 包含 functions(内置函数)以及types(内置类)。
    如:type(len) 是 builtin_function_or_method,type(range) 则是 type。

今日鸡汤

Python中函数与方法的区别?
今天的鸡汤有点狠,但是我们都要在快生活[emmm…]当中找到平静又有力量的自己,谢谢你看到这里啦,不防再来个在看与关注叭~笔芯

Python中函数与方法的区别?

相关标签: 少女的技术文章