您好,登錄后才能下訂單哦!
這篇文章主要介紹python中怎么通過函數(shù)名調(diào)用函數(shù),文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
常用內(nèi)置函數(shù)
(不用import就可以直接使用) :
help(obj) 在線幫助, obj可是任何類型
callable(obj) 查看一個(gè)obj是不是可以像函數(shù)一樣調(diào)用
repr(obj) 得到obj的表示字符串,可以利用這個(gè)字符串
eval重建該對(duì)象的一個(gè)拷貝
eval_r(str) 表示合法的python表達(dá)式,返回這個(gè)表達(dá)式
dir(obj) 查看obj的name space中可見的name
hasattr(obj,name) 查看一個(gè)obj的name space中是否有name
getattr(obj,name) 得到一個(gè)obj的name space中的一個(gè)name
setattr(obj,name,value) 為一個(gè)obj的name space中的一個(gè)name指向vale這個(gè)object
delattr(obj,name) 從obj的name space中刪除一個(gè)name vars(obj) 返回一個(gè)object的name
space。用dictionary表示
locals() 返回一個(gè)局部name space,用dictionary表示
globals() 返回一個(gè)全局name space,用dictionary表示
type(obj) 查看一個(gè)obj的類型
isinstance(obj,cls) 查看obj是不是cls的instance
issubclass(subcls,supcls) 查看subcls是不是supcls的子類
1.通過eval調(diào)用同一個(gè)類內(nèi)的函數(shù) eval()使用原因:
1)在編譯語言里要?jiǎng)討B(tài)地產(chǎn)生代碼,基本上是不可能的,但動(dòng)態(tài)語言是可以,意味著軟件已經(jīng)部署到服務(wù)器上了,但只要作很少的更改,只好直接修改這部分的代碼,就可立即實(shí)現(xiàn)變化,不用整個(gè)軟件重新加載。
2)在machin learning里根據(jù)用戶使用這個(gè)軟件頻率,以及方式,可動(dòng)態(tài)地修改代碼,適應(yīng)用戶的變化。
eval()函數(shù)
eval(expression[, globals[, locals]])
expression – 表達(dá)式。
globals – 變量作用域,全局命名空間,如果被提供,則必須是一個(gè)字典對(duì)象。
locals – 變量作用域,局部命名空間,如果被提供,可以是任何映射對(duì)象。
返回傳入字符串的表達(dá)式的結(jié)果
class TestA: def __init__(self): self.config_dict = { "be_called_function_name": "self.be_called_function()", } pass def active_call_function(self): print("here is active_call_function.") be_called_function_name = self.config_dict["be_called_function_name"] # 就直接調(diào)用。如果有其他參數(shù),一樣地傳就好了 # 另外也可以是"be_called_function_name"是"be_called_function",然后eval(be_called_function_name)() eval(be_called_function_name) pass def be_called_function(self): print("here is be_called_function.") if __name__ == "__main__": obj = TestA() obj.active_call_function()
2.通過eval調(diào)用同一個(gè)文件內(nèi)的一級(jí)函數(shù)
class TestA: def __init__(self): self.config_dict = { "be_called_function_name": "be_called_function()", } pass def active_call_function(self): print("here is active_call_function.") be_called_function_name = self.config_dict["be_called_function_name"] # 就直接調(diào)用。如果有其他參數(shù),一樣地傳就好了 # 另外也可以是"be_called_function_name"是"be_called_function",然后eval(be_called_function_name)() eval(be_called_function_name) pass def be_called_function(): print("here is be_called_function.") if __name__ == "__main__": obj = TestA() obj.active_call_function()
getattr() 函數(shù)用于返回一個(gè)對(duì)象屬性值。語法如下:
getattr(object, name[, default])
object – 對(duì)象。
name – 字符串,對(duì)象屬性。
default – 默認(rèn)返回值,如果不提供該參數(shù),在沒有對(duì)應(yīng)屬性時(shí),將觸發(fā) AttributeError。
getattr(object, name) = object.name
getattr(a, ‘b')的作用就和a.b是一樣的
示例:
result = obj.method(args) // 使用getattr func = getattr(obj, "method") result = func(args) // 或者寫成一行 result = getattr(obj, "method")(args)
主要有兩種異常,異常的安全用法:
AttributeError:對(duì)象中沒有該屬性。
try: func = getattr(obj, "method") except AttributeError: ...... deal else: result = func(args) // 或指定默認(rèn)返回值 func = getattr(obj, "method", None) if func: func(args)
TypeError: 不可調(diào)用
func = getattr(obj, "method", None) if callable(func): func(args)
1.通過函數(shù)名調(diào)用同一個(gè)類內(nèi)的函數(shù)
class TestA: def __init__(self): self.config_dict = { "be_called_function_name": "be_called_function", } pass def active_call_function(self): print("here is active_call_function.") # getaattr(module_name, function_name),module_name傳self即可 be_called_function = getattr(self, self.config_dict["be_called_function_name"]) # 就直接調(diào)用。如果有其他參數(shù),一樣地傳就好了 be_called_function() pass def be_called_function(self): print("here is be_called_function.") if __name__ == "__main__": obj = TestA() obj.active_call_function()
2.通過函數(shù)名調(diào)用其他類的函數(shù)
class TestA: def __init__(self): self.config_dict = { "be_called_function_name": "be_called_function", } pass def active_call_function(self): print("here is active_call_function.") # getaattr(module_name, function_name),module_name傳被調(diào)用的函數(shù)所在的類的類實(shí)例 testb_obj = TestB() be_called_function = getattr(testb_obj, self.config_dict["be_called_function_name"]) # 就直接調(diào)用。如果有其他參數(shù),一樣地傳就好了 be_called_function() pass class TestB: def be_called_function(self): print("here is be_called_function.") if __name__ == "__main__": obj = TestA() obj.active_call_function()
3.通過函數(shù)名調(diào)用同文件的一級(jí)函數(shù)
import sys class TestA: def __init__(self): self.config_dict = { "be_called_function_name": "be_called_function", } pass def active_call_function(self): print("here is active_call_function.") # getaattr(module_name, function_name),module_name傳當(dāng)前模塊名 module_name = sys.modules['__main__'] be_called_function = getattr(module_name, self.config_dict["be_called_function_name"]) # 就直接調(diào)用。如果有其他參數(shù),一樣地傳就好了 be_called_function() pass def be_called_function(): print("here is be_called_function.") if __name__ == "__main__": obj = TestA() obj.active_call_function()
4.通過函數(shù)名調(diào)用在其他文件的一級(jí)函數(shù)
class TestA: def __init__(self): self.config_dict = { "be_called_function_name": "be_called_function", } pass def active_call_function(self): print("here is active_call_function.") # getaattr(module_name, function_name),module_name傳函數(shù)所在模塊名 # __import__()傳函數(shù)所在文件 module_name = __import__("test_call_function_by_string1") be_called_function = getattr(module_name, self.config_dict["be_called_function_name"]) # 就直接調(diào)用。如果有其他參數(shù),一樣地傳就好了 be_called_function() pass if __name__ == "__main__": obj = TestA() obj.active_call_function()
以上是“python中怎么通過函數(shù)名調(diào)用函數(shù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。