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…]当中找到平静又有力量的自己,谢谢你看到这里啦,不防再来个在看与关注叭~笔芯

在这里插入图片描述

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值