这篇教程python通过函数名调用函数的几种方法总结写得很实用,希望能帮到您。 一、通过eval实现 常用内置函数 (不用import就可以直接使用) : - help(obj) 在线帮助, obj可是任何类型
- callable(obj) 查看一个obj是不是可以像函数一样调用
- repr(obj) 得到obj的表示字符串,可以利用这个字符串
- eval重建该对象的一个拷贝
- eval_r(str) 表示合法的python表达式,返回这个表达式
- dir(obj) 查看obj的name space中可见的name
- hasattr(obj,name) 查看一个obj的name space中是否有name
- getattr(obj,name) 得到一个obj的name space中的一个name
- setattr(obj,name,value) 为一个obj的name space中的一个name指向vale这个object
- delattr(obj,name) 从obj的name space中删除一个name vars(obj) 返回一个object的name
- space。用dictionary表示
- locals() 返回一个局部name space,用dictionary表示
- globals() 返回一个全局name space,用dictionary表示
- type(obj) 查看一个obj的类型
- isinstance(obj,cls) 查看obj是不是cls的instance
- issubclass(subcls,supcls) 查看subcls是不是supcls的子类
1.通过eval调用同一个类内的函数 eval()使用原因: 1)在编译语言里要动态地产生代码,基本上是不可能的,但动态语言是可以,意味着软件已经部署到服务器上了,但只要作很少的更改,只好直接修改这部分的代码,就可立即实现变化,不用整个软件重新加载。 2)在machin learning里根据用户使用这个软件频率,以及方式,可动态地修改代码,适应用户的变化。 eval()函数 eval(expression[, globals[, locals]]) - expression – 表达式。
- globals – 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
- locals – 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
返回传入字符串的表达式的结果 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"] # 就直接调用。如果有其他参数,一样地传就好了 # 另外也可以是"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调用同一个文件内的一级函数 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"] # 就直接调用。如果有其他参数,一样地传就好了 # 另外也可以是"be_called_function_name"是"be_called_function",然后eval(be_called_function_name)() eval(be_called_function_name) passdef be_called_function(): print("here is be_called_function.")if __name__ == "__main__": obj = TestA() obj.active_call_function() 二、通过getattr实现getattr() 函数用于返回一个对象属性值。语法如下: getattr(object, name[, default]) - object – 对象。
- name – 字符串,对象属性。
- default – 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。
getattr(object, name) = object.name getattr(a, ‘b')的作用就和a.b是一样的 示例: result = obj.method(args) // 使用getattrfunc = getattr(obj, "method")result = func(args)// 或者写成一行result = getattr(obj, "method")(args) 主要有两种异常,异常的安全用法: AttributeError:对象中没有该属性。 try: func = getattr(obj, "method")except AttributeError: ...... dealelse: result = func(args) // 或指定默认返回值func = getattr(obj, "method", None)if func: func(args) TypeError: 不可调用 func = getattr(obj, "method", None)if callable(func): func(args) 1.通过函数名调用同一个类内的函数 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"]) # 就直接调用。如果有其他参数,一样地传就好了 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.通过函数名调用其他类的函数 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传被调用的函数所在的类的类实例 testb_obj = TestB() be_called_function = getattr(testb_obj, self.config_dict["be_called_function_name"]) # 就直接调用。如果有其他参数,一样地传就好了 be_called_function() passclass TestB: def be_called_function(self): print("here is be_called_function.")if __name__ == "__main__": obj = TestA() obj.active_call_function() 3.通过函数名调用同文件的一级函数 import sysclass 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传当前模块名 module_name = sys.modules['__main__'] be_called_function = getattr(module_name, self.config_dict["be_called_function_name"]) # 就直接调用。如果有其他参数,一样地传就好了 be_called_function() passdef be_called_function(): print("here is be_called_function.")if __name__ == "__main__": obj = TestA() obj.active_call_function() 4.通过函数名调用在其他文件的一级函数 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传函数所在模块名 # __import__()传函数所在文件 module_name = __import__("test_call_function_by_string1") be_called_function = getattr(module_name, self.config_dict["be_called_function_name"]) # 就直接调用。如果有其他参数,一样地传就好了 be_called_function() passif __name__ == "__main__": obj = TestA() obj.active_call_function() 到此这篇关于python通过函数名调用函数的几种方法总结的文章就介绍到这了,更多相关python通过函数名调用函数内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net! Python爬虫实战之爬取京东商品数据并实实现数据可视化 只用Python就可以制作的简单词云 |