Python 函数 与 方法判断

通常情况下,我们一般不会严格去区分是函数还是方法,但假期有需要,或者被问到,我们要怎么区别函数与方法呢?我们先看下面的例子:

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对象。

 

上一篇:Python 反射

下一篇:Python 上下文管理器