您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:python通过函数名调用函数的几种方法总结

51自学网 2021-10-30 22:29:58
  python
这篇教程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就可以制作的简单词云
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。