Python中的函数(function)与方法(method)使用详解

 更新时间:2025年09月30日 09:41:28   作者:沉觞流年  
文章解析Python中函数与方法的区分,指出inspect.isfunction()和ismethod()的判断标准:内置函数不被认定为函数,静态方法不被视为方法,仅类方法和实例方法符合狭义定义

在编程语言中有两个很基础的概念,即方法(method)和函数(function)。

除去入参、返回值、匿名函数之类的正确的形式内容之外,我们一般都会这样说:“函数就是定义在类外面的,而方法就是定义在类里面的,跟类绑定的”

深究一下

判断是函数(function)还是方法(method)

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

import inspect

def test1():
    print('这是方法还是函数?')

print(inspect.isfunction(test1)) # True
print(inspect.ismethod(test1)) # False

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

注意:不能用这种方式,这种方式会调用函数

import inspect

def test1():
    print('这是方法还是函数?')


print(inspect.isfunction(test1()))

# 输出结果
这是方法还是函数?
False

inspect.ismethod() 与 inspect.isfunction()

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

import inspect

print(inspect.isfunction(inspect.ismethod))   # True
print(inspect.isfunction(inspect.isfunction))   # True

那么,inspect 库的两个函数是什么工作原理呢?

看看源码,将鼠标光标处放在要查看的内容上,按住Ctrl并单击鼠标左键,进入源码查看

通过 isfunction() 和 ismethod() 的注释,我们可以得到以下结论:

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

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

import inspect

print(inspect.isfunction(len)) # False

print(inspect.isfunction(range)) # False

可以发现,它们的本质并不是函数,事实上,它们有专属的类别(BuiltinFunctionType、BuiltinMethodType)

print(type(len))
输出结果:
<class 'builtin_function_or_method'>

内置函数都是builtin_function_or_method 类型

  • 一个类的静态方法,在 ismethod() 眼里并不是方法(MethodType)!
class MyTest():

    @classmethod
    def cls_func(cls):
        pass

    def ins_func(self):
        pass

    @staticmethod
    def sta_func():
        pass

print(inspect.ismethod(MyTest.cls_func))  # True
print(inspect.ismethod(MyTest.ins_func))  # False
print(inspect.ismethod(MyTest.sta_func))  # False

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

test = MyTest()

print(inspect.ismethod(test.cls_func))  # True
print(inspect.ismethod(test.ins_func))  # True
print(inspect.ismethod(test.sta_func))  # False

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

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

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



经过简化处理后,最关键是在于:通过type() 函数判断出一个对象是 function 或 method 类,instance() 函数判断出一个对象是否为某个类的实例

所以

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

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

若以 inspect 库的两个函数为判断依据,则 Python 中的“方法与函数”具有一定的狭义性。

在判断什么是函数时,它们并不把内置函数计算在内。同时,在判断什么是方法时,并非定义在类内部的都算,而是只有类方法及绑定了实例的实例方法才算是“方法”。

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

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

但是,理论和广义概念只是方便人们的沟通理解,而代码实现才是本质的区别。

也就是说,Python 在实际区别“方法与函数”时,文中开头所说:“函数就是定义在类外面的,而方法就是定义在类里面的,跟类绑定的”,这句话并没有错,但其中的细节还是值得关注的。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决.ui文件生成的.py文件运行不出现界面的方法

    解决.ui文件生成的.py文件运行不出现界面的方法

    今天小编就为大家分享一篇解决.ui文件生成的.py文件运行不出现界面的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • Python自动提取项目中导入的库及其版本信息

    Python自动提取项目中导入的库及其版本信息

    在我们有时需要迁移或部署项目时,需要知道项目所依赖的三方包和版本,本文就来介绍一下Python自动提取项目中导入的库及其版本信息,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Python实现指定区域桌面变化监控并报警

    Python实现指定区域桌面变化监控并报警

    在这篇博客中,我们将使用Python编程语言和一些常用的库来实现一个简单的区域监控和变化报警系统,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2023-07-07
  • Python math 模块完全指南

    Python math 模块完全指南

    本文主要介绍了Python math 模块完全指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 使用python绘制cdf的多种实现方法

    使用python绘制cdf的多种实现方法

    今天小编就为大家分享一篇使用python绘制cdf的多种实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • python实现不同文件夹下的函数相互调用

    python实现不同文件夹下的函数相互调用

    这篇文章主要介绍了python实现不同文件夹下的函数相互调用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • django2笔记之路由path语法的实现

    django2笔记之路由path语法的实现

    这篇文章主要介绍了django2笔记之路由path语法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • 学好python基本数据类型

    学好python基本数据类型

    这篇文章主要介绍了学好python基本数据类型,学习python基本数据类型我们需要了解基本数据类型有数字int、布尔值bool、字符串str、列表list、元组tuple、字典dict等,其中包括他们的基本用法和其常用的方法,下面来看看文章的具体介绍吧
    2021-12-12
  • pytest用例执行顺序和跳过执行详解

    pytest用例执行顺序和跳过执行详解

    本文主要介绍了pytest用例执行顺序和跳过执行详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 简洁的十分钟Python入门教程

    简洁的十分钟Python入门教程

    这篇文章主要介绍了简洁的十分钟Python入门教程,Python语言本身的简洁也使得网络上各种Python快门入门教程有着很高的人气,本文是国内此类其中的一篇,需要的朋友可以参考下
    2015-04-04

最新评论