学编程这么久,还傻傻分不清什么是方法(method),什么是函数(function)?...

方法_方法的定义和调用 【1】什么是方法? 方法(method)就是一段用来完成特定功能的代码片段,类似于其它语言的函数(function)。 方法用于定义该类或该类的实例的行为特征和功能实现。 方法是类和对象行为特征的抽象。方法很类似于面向过程中的函数。面向过程中,函数是最基本单位,整个程序由一个个函数调用组成。面向对象中,整个程序的基本单位是类,方法是从属于类和对象的。 【2】方法声明格式: [修饰符1 修饰符2 …] 返回值类型 方法名(形式参数列表){ Java语句;… … … } 【3】方法的调用方式: 对象 阅读详情

点击上方“编程派”,选择设为“设为星标”

优质文章,第一时间送达!

作者:豌豆花下猫

来自:Python猫 

链接:https://mp.weixin.qq.com/s/e6rIc-dPhbqWAeJvekawwQ

在编程语言中有两个很基础的概念,即方法(method)和函数(function)。如果达到了编程初级/入门级水平,那么你肯定在心中已有了初步的答案。

也许在你心中已有答案了

除去入参、返回值、匿名函数之类的正确的形式内容之外,你也许会说“函数就是定义在类外面的,而方法就是定义在类里面的,跟类绑定的”。

这种说法有没有问题呢?当然有!不然我就不会专门写这篇文章了,本文主要会来厘清这个问题。

在标准库inspect 中,它提供了两个自省的函数,即 ismethod() 和 isfunction(),可以用来判断什么是方法,什么是函数。

因此,本文想要先来研究一下这两个函数,看看 Python 在处理方法/函数的概念时,是怎么做的?

关于它们的用法,先看一个最简单的例子:

运行的结果分别是“True”和“False”,表明我们所定义的 test() 是一个函数,而不是一个方法。

这两个函数也可以用来检测自身,不难验证出它们都是一种函数:

那么,接下来的问题是:inspect 库的两个函数是什么工作原理呢?

先来看看 inspect 中的实现代码:

在源码中,我们看到了 isinstance() 函数,它主要用于判断一个对象(object)是否是某个类(class)的实例(instance)。

我们还看到了 types.FunctionType 及types.MethodType ,它们指的就是目标类。继续点进去看源码:

# 摘自 types.py
def _f(): pass
FunctionType = type(_f)

class _C:
    def _m(self): pass
MethodType = type(_C()._m)

这里只是定义了两个空的 _f() 和 _m(),然后就使用了内置的 type() 函数。所以,我们完全可以把它们摘出来,看看庐山真面目:

梳理它们的关系,可以得到:

经过简化处理后,我们发现最关键的是两个问题:type() 函数如何判断出一个对象是 function 或 method 类?instance() 函数如何判断出一个对象是某个类的实例?

这两个内置函数都是用 C 语言实现的,这里我就不打算继续深究了……

但是,让我们再回头看看 inspect 中的注释,就会注意到一些端倪:

  • isfunction() 判断出的是用户定义的函数(user-defined function), 它拥有__doc__、__name__ 等等属性

  • ismethod() 判断出的是实例方法(instance method), 它拥有函数的一些属性,最特别的是还有一个 __self__ 属性

还是注释更管用啊,由此我们能得到如下的推论:

1、非用户定义的函数,即内置函数,在 isfunction() 眼里并不是“函数”(FunctionType)!

下面验证一下 len()、dir() 和 range():

事实上,它们有专属的类别(BuiltinFunctionType、BuiltinMethodType):

特别需要注意的是,内置函数都是builtin_function_or_method 类型,但是 range()、type()、list() 等看起来像是函数的,其实不然:

2、一个类的静态方法,在 ismethod() 眼里并不是方法(MethodType)!

创建了类的实例后,再看看:

可以看出,除了 classmethod 之外,只有类实例的实例方法,才会被 ismethod() 判定为真!而静态方法,不管绑定在类还是实例上,都不算是“方法”!

有没有觉得很不可思议(或者有点理不清了)?

好了,回到本文开头的问题,我们最后来小结一下吧。

若以 inspect 库的两个函数为判断依据,则 Python 中的“方法与函数”具有一定的狭义性。在判断什么是函数时,它们并不把内置函数计算在内。同时,在判断什么是方法时,并非定义在类内部的都算,而是只有类方法及绑定了实例的实例方法才算是“方法”。

也许你会说,inspect 的两个判断函数并不足信,内置函数也应该算是“函数”,类里面的所有方法都应该算是“方法”。

我承认这种说法在广义上是可接受的,毕竟我们一直叫的就是“XX函数”、“XX方法”嘛。

但是,理论和广义概念只是方便人们的沟通理解,而代码实现才是本质的区别。也就是说,Python 在实际区别“方法与函数”时,并不是文中开头的简单说法,还有更多的细节值得关注。

回复下方「关键词」,获取优质资源

回复关键词「 pybook03」,立即获取主页君与小伙伴一起翻译的《Think Python 2e》电子版
回复关键词「入门资料」,立即获取主页君整理的 10 本 Python 入门书的电子版
回复关键词「m」,立即获取Python精选优质文章合集
回复关键词「book 数字」,将数字替换成 0 及以上数字,有惊喜好礼哦~
题图:pexels,CC0 授权。

重装系统后,恢复Oracle的.ORA文件 前几天,系统莫名奇妙产生很多宏病毒,进而感染整个C盘,不得已,格式化后重装了系统。 重装系统之后,突然想到D盘中的oracle中很多数据没导出来备份,安装文件下有很多有用的.ORA文件,抱着死马当活马医的态度,居然成功了。 1、将原来D盘(D:\oracle\product\10.2.0\oradata\orcl)下的数据文件备份下其他盘,将D盘的oracle目录名改成oracle1。安装数据 阅读详情

相关推荐

openvpn 安装 (Alibaba Cloud Linux release 3 (Soaring Falcon))

1.错误:configure: error: libnl-genl-3.0 package not found or too old. Is the development package and pkg-config (/usr/bin/pkg-config) installed?# ta.key在/etc/openvpn/server/目录下可以如下配置,否则需要写完整路径。# 配置账号密码登录客户端需要ca证书(可选)# 证书校验算法 配置上面生成的完整路径。# ca证书 配置上面生成的完整路径。

dubhe_zhao的博客 2154

编程中常用英语单词

1. 编程常用英语词汇:  application 应用程式 应用、应用程序  application framework 应用程式框架、应用框架 应用程序框架  architecture 架构、系统架构 体系结构  argument 引数(传给函式的值)。叁见 parameter 叁数、实质叁数、实叁、自变量  array 阵列 数组  arrow operator arrow(箭头

陆总的博客 1722

Windows Server双机热备实战:用IIS+ARR+NLB搭建高可用Web服务(附避坑指南)

本文详细介绍了在Windows Server环境下,利用IIS、ARR(Application Request Routing)和NLB(Network Load Balancing)构建高可用Web服务的实战方案。通过双机热备架构,实现从网络层到应用层的全面冗余与智能流量分发,并提供了关键的配置步骤、常见避坑指南及性能调优建议,确保企业级Web服务的连续性与可靠性。

weixin_29210759的博客 388

学习java编程必须会的英语单词汇总

Compile:编绎 Run:运行 Class:类 Object:对象 System:系统 System:系统 out:输出 print:打印 line:行 variable:变量 type:类型 static:静态的 array:数组 parameter:参数 method:方法 function:函数 public:公有的 default:默认 get:得到

阿宝的博客 2万+

考试遇到 Assistant API 考点时,该掌握哪些要点?

【摘要】聚焦阿里云大模型 ACP 认证中智能体 Assistant API 考点,我结合自学认证成功经验,分享复习攻略。先解析 assistants、threads 等五个核心组件作用与关系,点明各组件支持及不支持的方法,最后给出计算 Python 代码调用大模型次数的思路,助力考生攻克考点、顺利拿证 。

davidkorhenn的博客 498

VisionMaster图像源模块的5个隐藏功能:从自动切换到二次开发接口

本文深入解析了VisionMaster图像源模块的5个隐藏功能,从基础的自动切换与字符触发过滤,到高级的脚本扩展与基于COM组件的二次开发接口。这些功能能显著提升工业视觉项目的自动化水平、灵活性与系统集成能力,帮助开发者实现更高效的离线测试流水线和外部精确控制。

rgv23456789的博客 652

java中方法和函数区别

面向对象的语言叫方法 面向过程的语言叫函数 在java中没有函数这么一说,只有方法一说。实际上方法就是函数,函数就是方法,只是在不同的语言不同的称呼而已。   一句话告诉你如何区分函数与方法:函数是大家的函数,方法是类的方法。 如何区分一个ITer是设计师还是码工。 看看他是在调别人的库,还是自己写出JAR包跟别人分享。 感觉差的不是一个级别而已啊。 一个东西,用对象调用的叫方法,直接调函...

zx_balabala的博客 1万+

【蓝牙专题】HCI协议解析

一、概念: 很多人接触蓝牙,是从HCI开始,因为HCI是主机控制接口协议(Host Controller Interface),蓝牙命令通过HCI来发送到Controller; 1、架构 如下图,HCI通过物理接口(USB、UART等)或虚拟接口,传递数据到Controller,Controller也通过同样的接口发送接收数据,这里注意到HCI层是在L2CAP层之下,LMP层之上; HCI

蚂蚁的专栏 5070

方法和函数的区别

在日常的撸码中,有很多朋友会对方法和函数这俩个概念有所混淆,在我看来,这俩个概念很有区别,今天就给大家详细讲解一下子。 1、方法是特殊的函数,可以说是函数的子集 2、方法平常往往是和类有关的,是我们在面向对象语言中会提到,用到的。 3、函数是一一映射的关系,给定一个变量,则会出现一个确定的值。 下面我们具体分析一下。 在C语言中,不存在方法这一说,因为C语言是面向过程的语言;而在Java...

qq_42199781的博客 1万+

TC3XX - MCAL知识点(三十九):AURIX™ TC3xx 的EDSADC实现旋变解码功能(应用笔记记录)

本文总结了英飞凌应用笔记中关于EDSADC旋变解码系统的关键内容。系统通过调幅解调获取电机位置和速度信号,支持内外载波生成方案,其中内部载波方案更常用(需2个DSADC通道)。重点介绍了滤波器链配置建议(避免FIR1)、系统条件要求(如偶数积分周期)以及群延迟计算方法。特别分析了SDCAP功能对硬件延迟的补偿机制,指出温度等因素可能导致外部电路延迟变化,需通过计数器测量并通过软件调整积分器起始点来消除角度误差。文中还提供了不同硬件延迟情况下的信号处理示例。

梦想技术家 464

RAG系统中Embedding模型选型实战

本文详细介绍了RAG系统中Embedding模型选型实战,希望能对学习RAG的同学们有所帮助。 文章目录 1. 前言 2. 思路解析 3. 测评数据集构建 3.1 步骤一 3.2 步骤二 3.3 数据示例 3.4 总结 4. 实战代码 4.1 本地模型 4.2 使用第三方的Embedding模型API

herosunly的博客 17万+

function函数的用法_学编程这么久,还傻傻分不清什么是方法(method),什么是函数(function)?

在编程语言中有两个很基础的概念,即方法(method)和函数(function)。如果达到了编程初级/入门级水平,那么你肯定在心中已有了初步的答案。除去入参、返回值、匿名函数之类的正确的形式内容之外,你也许会说“函数就是定义在类外面的,而方法就是定义在类里面的,跟类绑定的”。这种说法有没有问题呢?当然有!不然我就不会专门写这篇文章了,本文主要会来厘清这个问题。在标准库inspect 中,它提供了两...

weixin_39663360的博客 304

jeecg-boot getDictItemsByTable接口存在SQL注入漏洞CVE-2024-48307

微信公众号搜索:南风漏洞复现文库该文章 南风漏洞复现文库 公众号首发JeecgBoot 是一款开源的的低代码开发平台。

nnn2188185的博客 334

C语言中method方法,学编程这么久,还傻傻分不清什么是方法(method),什么是函数(function)?...

orange-tabby-cat-1769642.jpg在编程语言中有两个很基础的概念,即方法(method)和函数(function)。如果达到了编程初级/入门级水平,那么你肯定在心中已有了初步的答案。也许在你心中已有答案了除去入参、返回值、匿名函数之类的正确的形式内容之外,你也许会说“函数就是定义在类外面的,而方法就是定义在类里面的,跟类绑定的”。这种说法有没有问题呢?当然有!不然我就不会专门...

weixin_42509396的博客 1897

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

python method与function方法_学编程这么久,还傻傻分不清什么是方法(method),什么是函数(function)?...

在编程语言中有两个很基础的概念,即方法(method)和函数(function)。如果达到了编程初级/入门级水平,那么你肯定在心中已有了初步的答案。也许在你心中已有答案了除去入参、返回值、匿名函数之类的正确的形式内容之外,你也许会说“函数就是定义在类外面的,而方法就是定义在类里面的,跟类绑定的”。这种说法有没有问题呢?当然有!不然我就不会专门写这篇文章了,本文主要会来厘清这个问题。在标准库insp...

weixin_35381903的博客 229

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

python的两种编程方式是什么_学编程这么久,还傻傻分不清什么是方法(method),什么是函数(function)?...

在编程语言中有两个很基础的概念,即方法(method)和函数(function)。如果达到了编程初级/入门级水平,那么你肯定在心中已有了初步的答案。也许在你心中已有答案了除去入参、返回值、匿名函数之类的正确的形式内容之外,你也许会说“函数就是定义在类外面的,而方法就是定义在类里面的,跟类绑定的”。这种说法有没有问题呢?当然有!不然我就不会专门写这篇文章了,本文主要会来厘清这个问题。在标准库insp...

weixin_39638188的博客 126

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ifnull 不是可以识别的 内置函数名称。_学编程这么久,还傻傻分不清什么是方法(method),什么是函数(function)?...

?“Python猫” ,一个值得加星标的公众号在编程语言中有两个很基础的概念,即方法(method)和函数(function)。如果达到了编程初级/入门级水平,那么你肯定在心中已有了初步的答案。也许在你心中已有答案了除去入参、返回值、匿名函数之类的正确的形式内容之外,你也许会说“函数就是定义在类外面的,而方法就是定义在类里面的,跟类绑定的”。这种说法有没有问题呢?当然有!不然我就不会专...

weixin_30539081的博客 927

ext4.0中获取某个function的变量值_学编程这么久,还傻傻分不清什么是方法(method),什么是函数(function)?...

优质文章,第一时间送达!作者:豌豆花下猫来自:Python猫 链接:https://mp.weixin.qq.com/s/e6rIc-dPhbqWAeJvekawwQ在编程语言中有两个很基础的概念,即方法(method)和函数(function)。如果达到了编程初级/入门级水平,那么你肯定在心中已有了初步的答案。也许在你心中已有答案了除去入参、返回值、匿名函数之类的正确的形式内容之外,你也许会说“...

weixin_39571087的博客 118

别再傻傻分不清什么是方法(method),什么是函数(function)?

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 想要学习Python?有问题得不到第一时间解决?来看看这里,满足你的需求,资料都已经上传至文件中,可以自行下载!还有海量最新2020python学习资料。 点击查看 编程语言中有两个很基础的概念,即方法(method)和函数(function)。如果达到了编程初级/入门级水平,那么你肯定在心中已有了初步的答案。 也许在你心中已有答案了 除去入参、返回值、匿名函数之类的正确的形式内容之外,你也

weixin_49345590的博客 1401

python函数和方法概念_学编程这么久,还傻傻分不清什么是方法(method),什么是函数(function)?|python基础教程|python入门|python教程...

https://www.xin3721.com/eschool/pythonxin3721/在编程语言中有两个很基础的概念,即方法(method)和函数(function)。如果达到了编程初级/入门级水平,那么你肯定在心中已有了初步的答案。也许在你心中已有答案了除去入参、返回值、匿名函数之类的正确的形式内容之外,你也许会说“函数就是定义在类外面的,而方法就是定义在类里面的,跟类绑定的”。这种说法有...

weixin_39615596的博客 248

vue新手入门出现function () { [native code] }错误

控制台输出错误: [Vue warn]: Unknown custom element: <p1> - did you register the component correctly? For recursive components, make sure to provide the "name" option. 页面提示: function () { [native code] },无法出现我们想要的内容 页面代码: <!DOCTYPE html> <html la

qq_41966009的博客 1万+
上一篇: Python 中如何实现参数化测试?
下一篇: AI 如何识别西瓜和冬瓜?
codingpy
博客等级 码龄11年 1873粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值