基本上判斷python物件是否為可呼叫的函式,有三種方法:
1、使用內建的callable函式
callable(func)
用於檢查物件是否可呼叫,返回true也可能呼叫失敗,但是返回false一定不可呼叫
2、判斷物件型別是否是functiontype
type(func) isfunctiontype#或者
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__方法,那麼其實例也會成為乙個可呼叫物件,其型別為建立這個例項的類,而不是函式或方法。
classmyclass(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...