如何判斷乙個物件是否是可呼叫物件

2021-09-07 16:53:37 字數 2821 閱讀 2040

基本上判斷python物件是否為可呼叫的函式,有三種方法:

1、使用內建的callable函式

callable(func)

用於檢查物件是否可呼叫,返回true也可能呼叫失敗,但是返回false一定不可呼叫

2、判斷物件型別是否是functiontype

type(func) is

functiontype#或者

isinstance(func, functiontype)

3、判斷物件是否實現__call__方法

hasattr(func, '

__call__

')

例子:

#

三種驗證方式的區別

from types import

functiontype

class

a(object):

@staticmethod

deff1():

return

'from f1

'@classmethod

def f2(cls,*arg):

return

'from f2

'def f3(self,*arg):

return

'from f3

'def

f4():

pass

if__name__ == '

__main__':

a=a()

print('

靜態方法,例項呼叫驗證')

print(callable(a.f1)) #

true

print(type(a.f1) is functiontype) #

true

print(hasattr(a.f1,'

__call__

')) #

true

print('

靜態方法,類呼叫驗證')

print(callable(a.f2)) #

true

print(type(a.f2) is functiontype) #

false

print(hasattr(a.f2,'

__call__

')) #

true

print('

類方法驗證')

print(callable(a.f3)) #

true

print(type(a.f3) is functiontype) #

true

print(hasattr(a.f3,'

__call__

')) #

true

print('

例項方法驗證')

print(callable(a.f3)) #

true

print(type(a.f3) is functiontype) #

false

print(hasattr(a.f3, '

__call__

')) #

true

print('

函式驗證')

print(callable(f4)) #

true

print(type(f4) is functiontype) #

true

print(hasattr(f4,'

__call__

')) #

true

"""通過執行結果,發現三種方法的驗證結果並不相同。

主要是type(func) is functiontype方法,在驗證類方法和例項方法時,會返回false,

從除錯的結果上看,例項方法,和類方法的型別都是,不是functiontype,所以會返回false。

"""

python中分為函式(function)和方法(method),函式是python中乙個可呼叫物件(使用者定義的可呼叫物件,及lambda表示式

建立的函式,都是函式,其型別都是functiontype),方法是一種特殊的類函式。

官方文件中,對於method的定義:

methods are always bound to an instance of a user-defined class

類方法和類進行繫結,例項方法與例項進行繫結,所以兩者的型別都是method。

而靜態方法,本身即不和類繫結,也不和例項繫結,不符合上述定義,所以其型別應該是function。

其中還有需要注意的是,如果乙個類實現了__call__方法,那麼其實例也會成為乙個可呼叫物件,其型別為建立這個例項的類,而不是函式或方法。

class

myclass(object):

def__call__(self, *args, **kwargs):

return

self

if__name__ == '

__main__':

myclass=myclass()

print(callable(myclass)) #

true

所以通過型別去判斷python物件是否可呼叫,需要同時判斷是函式(functiontype)還是方法(methodtype),或者類是否實現__call__方法。

如果只是單純判斷python物件是否可呼叫,用callable()方法會更穩妥。

判斷乙個物件是否是陣列

用typeof方法返回的陣列型別是object,無法確定是否是陣列,但可以通過下面方法判斷。var is array function value 說明 首先判斷這個值是否有值,並且不是undifined或null的值 其次判斷這個值的typeof運算的結果是否是object 第三判斷這個值的len...

判斷乙個物件是否是陣列?

一 判斷乙個物件是否是陣列?var obj1 obj2 1 2 obj3 newdate 1.判斷當前物件的原型物件是否是陣列的原型物件 1.使用 proto 獲得物件的原型物件 obj1.proto array.prototype false obj2.proto array.prototype ...

如何判斷乙個物件是否死亡

每有乙個變數引用該物件時,引用計數器加1,當引用斷開時,計數器減1。優點 效率高 缺點 當兩個物件相互引用時,即使這兩個物件都沒有用了,還是不能夠被gc 建立乙個gc roots作為起始點,向下搜尋,搜尋所走過的路徑成為引用鏈,當物件沒有與任何引用鏈相連的話,則物件是可以被 的,否則不會被 gc r...