Python基础进阶3:函数和方法不是一回事

发布时间:2023年12月30日

你好,我是kelly,今天分享的是Python的函数与方法的不同点。

对于Python的函数和方法是不一样的,这一点需要注意下。

一、结论

1、不存在隐式传参,所有参数都是显式传递的是函数

2、存在隐式传参的是方法,一般指隐式传递实例或者类。

二、官方定义

看下Python官方说明截图:

解释就是:

1、限定是对于用户自定义类,可能是方法,具体看调用方式。

2、不强调类和实例,只要是用户自定义的是函数。

三、代码说明

from types import FunctionType, MethodType

def f00():
    pass

class Test(object):
    def f01(self):
        pass

    @staticmethod
    def f02():
        pass

    @classmethod
    def f03(cls):
        pass

def main():
    print("function/method: {}/{}".format(isinstance(f00, FunctionType), isinstance(f00, MethodType)), )
    
    obj = Test()
    print("\n实例调用")
    print("f01 function/method: {}/{}".format(isinstance(obj.f01, FunctionType), isinstance(obj.f01, MethodType)))
    print("f02 function/method: {}/{}".format(isinstance(obj.f02, FunctionType), isinstance(obj.f02, MethodType)))
    print("f03 function/method: {}/{}".format(isinstance(obj.f03, FunctionType), isinstance(obj.f03, MethodType)))

    print("\n类调用")
    print("f01 function/method: {}/{}".format(isinstance(Test.f01, FunctionType), isinstance(Test.f01, MethodType)))
    print("f02 function/method: {}/{}".format(isinstance(Test.f02, FunctionType), isinstance(Test.f02, MethodType)))
    print("f03 function/method: {}/{}".format(isinstance(Test.f03, FunctionType), isinstance(Test.f03, MethodType)))

运行结果:

function/method: True/False

实例调用
f01 function/method: False/True
f02 function/method: True/False
f03 function/method: False/True

类调用
f01 function/method: True/False
f02 function/method: True/False
f03 function/method: False/True

1、foo明显是函数。

2、对于类Test中的f01,属于属于实例方法,但不用调用方式得到不同结果,当实例调用时,存在隐式传参,为方法;当类调用时,不存在隐式传参,为函数

3、对于类Test中的f02,尽管使用staticmethod标记为静态方法,调用时不存在隐式传参,实际是函数

4、对于类Test中的f03,使用classmethod标记为类方法,调用时存在隐式传参,因此是方法

总结三句话:

1、类中实例方法,可能是方法,也可能是函数。

2、类中类方法,是方法。

3、类中静态方法和其他,是函数。

四、补充:

1)对于类中的实例方法,使用类调用时,必须显式将一个类实例传递进去。

2)对于类中的类方法,使用类调用时,Python解析器自动隐式传参,如下图所示。

好了,今天的分享就到这里。

本文原始版本发表链接:

https://mp.weixin.qq.com/s?__biz=MzI2Mjg3NTY5MQ==&mid=2247484703&idx=1&sn=c5cc8c3acbf9c279395bfc41247d8102&chksm=ea453a5bdd32b34ded1eab873951b5f51713f93699f6aa98203a4054a33bac751af9e66ef94e#rd

kelly会在公众号「kelly学技术」不定期更新文章,感兴趣的朋友可以关注一下,期待与您交流。


--over--

文章来源:https://blog.csdn.net/qm5132/article/details/135301799
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。