【Python】函数(function)和方法(method)的区别

这里先说结论,为了满足心急的小伙伴:methodfunction的最大区别就是参数有无进行绑定


自定义类Test:

首先先来一个自定义类:

class Test:
    def Func_normal(arg):
        print('Func_normal:',arg)
    @staticmethod
    def Func_static(arg):
        print('Func_static:',arg)
    @classmethod
    def Func_class(arg):
        print('Func_class:',arg)


代码样例:

先来一份代码以及运行结果:

obj=Test()#Test为本文开头提到的自定义类
for item in ['Test','obj']:
    print('\n'+('class'if item=='Test' else 'object'))
    for name in ['normal','static','class']:
        print(f'[{name}]',eval(f'{item}.Func_{name}'))

运行结果-1

为了更直观地看出差别,这里简单的编写一个表格:

属性访问 [normal] [@staticmethod] [@classmethod]
class function function method-class
object method-object function method-class

可以看出通过类和通过对象访问到的是不完全一致的,而这与本主题有关。
但是仅仅通过这个还不够直观地表现出它们的差异性,这里再附加一份测试代码以及运行结果:

obj=Test()#Test为本文开头提到的自定义类
for item in ['Test','obj']:
    for name in ['normal','static','class']:
        try:
            tx=f'{item}.Func_{name}()'
            print('>>>',tx)
            exec(tx)
        except Exception as e:
            print(e)
    print()

运行结果-2

这里同样贴心地将上面的结果整理成表格便于对比:

不传参数 [normal] [@staticmethod] [@classmethod]
class <错误:缺失1参> <错误:缺失1参> class
object object <错误:缺失1参> class


分析:

在上面的代码样例中得到两张表格,这里再重新把俩表格放在一起以便进行对比,请仔细比对俩表格之间的差异。

属性访问 [normal] [@staticmethod] [@classmethod]
class function function method-class
object method-object function method-class
不传参数 [normal] [@staticmethod] [@classmethod]
class <错误:缺失1参> <错误:缺失1参> class
object object <错误:缺失1参> class

以下为结论:

  • methodfunction的最大区别就是参数有无进行绑定。
  • 在本例中,method在调用时不需要参数,因为第一个参数已经与特定对象进行了绑定,而function需要传入1参数才能正常调用。
  • @classmethod的作用是将函数的第一个参数绑定为本类(无论是通过类还是类对象进行调用),@staticmethod的作用则是撤去第一个参数的绑定。


完整代码:

class Test:
    def Func_normal(arg):
        print('Func_normal:',arg)
    @staticmethod
    def Func_static(arg):
        print('Func_static:',arg)
    @classmethod
    def Func_class(arg):
        print('Func_class:',arg)

obj=Test()
for item in ['Test','obj']:
    print('\n'+('class'if item=='Test' else 'object'))
    for name in ['normal','static','class']:
        print(f'[{name}]',eval(f'{item}.Func_{name}'))

print('\n\n'+'——'*30+'\n\n')

obj=Test()
for item in ['Test','obj']:
    for name in ['normal','static','class']:
        try:
            tx=f'{item}.Func_{name}()'
            print('>>>',tx)
            exec(tx)
        except Exception as e:
            print(e)
    print()

本文发布于CSDN,未经本人同意不得私自转载:https://blog.csdn.net/weixin_44733774/article/details/133509177文章来源地址https://uudwc.com/A/3wj9R

原文地址:https://blog.csdn.net/weixin_44733774/article/details/133509177

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

h
上一篇 2023年10月28日 21:09
学信息系统项目管理师第4版系列15_资源管理基础
下一篇 2023年10月28日 22:09