通常情况下,我们一般不会严格去区分是函数还是方法,但假期有需要,或者被问到,我们要怎么区别函数与方法呢?我们先看下面的例子:
def func():
pass
print(func)
class A:
def func(self):
pass
print(A.func)
obj = A()
print(obj.func)
# 输出:
<function func at 0x7f34995a2e18>
<function A.func at 0x7f34994ae400>
<bound method A.func of <__main__.A object at 0x7f34994b7400>>
可以看到obj.fun是method,即绑定方法。
下面我们对代码略作修改,通过python内置的方法来判断
from types import FunctionType
from types import MethodType
def func():
pass
print(func)
class A:# True
def func(self):
pass
print(A.func)
obj = A()
print(obj.func)
print(isinstance(func,FunctionType)) # True
print(isinstance(A.func,FunctionType)) # True
print(isinstance(obj.func,FunctionType)) # False
print(isinstance(obj.func,MethodType)) # True
# 输出
(base_env) andy@Andy963:/mnt/c/Users/Andy/Desktop$ python code.py
<function func at 0x7febe1fa2e18>
<function A.func at 0x7febe1e4eea0>
<bound method A.func of <__main__.A object at 0x7febe1ee7400>>
True
True
False
True
可以看到结果与上面的一致。
我们知道,类中可以定义多种方法,如:staticmethod, classmethod, 它们又有什么区别呢
from types import FunctionType
from types import MethodType
class A:
def func(self):
pass
@classmethod
def func1(cls):
pass
@staticmethod
def func2(self):
pass
@property
def func3(self):
pass
obj = A()
print(isinstance(obj.func, FunctionType))
print(isinstance(obj.func, MethodType))
print(isinstance(obj.func1, FunctionType))
print(isinstance(obj.func1, MethodType))
print(isinstance(obj.func2, FunctionType))
print(isinstance(obj.func2, MethodType))
print(isinstance(obj.func3, FunctionType))
# 输出:
(base_env) andy@Andy963:/mnt/c/Users/Andy/Desktop$ python code.py
False
True
False
True
True
False
False
可以看到静态方法其实是函数,它就是个普通函数,而属性则两者都不是。
(1)函数是显式传递数据的。如我们要指明为len()函数传递一些要处理数据。
(2)函数则跟对象无关。
(3)方法中的数据则是隐式传递的。
(4)方法可以操作类内部的数据。
(5)方法跟对象是关联的。如我们在用strip()方法是,是不是都是要通过str对象调用,比如我们有字符串s,然后s.strip()这样调用。是的,strip()方法属于str对象。