你好,我是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解析器自动隐式传参,如下图所示。
好了,今天的分享就到这里。
本文原始版本发表链接:
kelly会在公众号「kelly学技术」不定期更新文章,感兴趣的朋友可以关注一下,期待与您交流。
--over--