python通过函数名调用函数的几种场景


Posted in Python onSeptember 23, 2020

一、说明

之前写了一篇“Python执行系统命令教程”讲了如何执行系统命令。

除了执行系统命令外,我们有时还需要动态地执行一些python代码,有经验的朋友就会知道可以使用内置函数eval实现这一需求,如eval("print(__file__)"),这还是比较简单的。

但如果要动态执行一个函数,讲的资料就会少一点,这次就要看这个需求该如何实现。

二、通过eval实现

2.1 通过eval调用同一个类内的函数

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.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)
  pass

def be_called_function():
 print("here is be_called_function.")

if __name__ == "__main__":
 obj = TestA()
 obj.active_call_function()

三、通过getattr实现

3.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()

3.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()
  pass


class TestB:
 def be_called_function(self):
  print("here is be_called_function.")


if __name__ == "__main__":
 obj = TestA()
 obj.active_call_function()

3.3 通过函数名调用同文件的一级函数

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传当前模块名
  module_name = sys.modules['__main__']
  be_called_function = getattr(module_name, self.config_dict["be_called_function_name"])
  # 就直接调用。如果有其他参数,一样地传就好了
  be_called_function()
  pass


def be_called_function():
 print("here is be_called_function.")


if __name__ == "__main__":
 obj = TestA()
 obj.active_call_function()

3.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()
  pass


if __name__ == "__main__":
 obj = TestA()
 obj.active_call_function()

以上就是python通过函数名调用函数的几种场景的详细内容,更多关于python通过函数名调用函数的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
在python中安装basemap的教程
Sep 20 Python
浅谈python的dataframe与series的创建方法
Nov 12 Python
python中pytest收集用例规则与运行指定用例详解
Jun 27 Python
python flask 如何修改默认端口号的方法步骤
Jul 12 Python
Python完成哈夫曼树编码过程及原理详解
Jul 29 Python
python中的global关键字的使用方法
Aug 20 Python
Python字符串中添加、插入特定字符的方法
Sep 10 Python
pytorch-RNN进行回归曲线预测方式
Jan 14 Python
基于python实现可视化生成二维码工具
Jul 08 Python
C++和python实现阿姆斯特朗数字查找实例代码
Dec 07 Python
5 分钟读懂Python 中的 Hook 钩子函数
Dec 09 Python
python的列表生成式,生成器和generator对象你了解吗
Mar 16 Python
Python如何执行系统命令
Sep 23 #Python
Python SMTP发送电子邮件的示例
Sep 23 #Python
python两个list[]相加的实现方法
Sep 23 #Python
python matplotlib库的基本使用
Sep 23 #Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
Sep 23 #Python
Python读取多列数据以及用matplotlib制作图表方法实例
Sep 23 #Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
Sep 23 #Python
You might like
PHP的宝库目录--PEAR
2006/10/09 PHP
PHP安装问题
2006/10/09 PHP
ThinkPHP php 框架学习笔记
2009/10/30 PHP
PHP jpgraph库的配置及生成统计图表:折线图、柱状图、饼状图
2017/05/15 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
2017/08/02 PHP
PHP数据源架构模式之表入口模式实例分析
2020/01/23 PHP
javascript 特性检测并非浏览器检测
2010/01/15 Javascript
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
2010/11/21 Javascript
使用Grunt.js管理你项目的应用说明
2013/04/24 Javascript
js单词形式的运算符
2014/05/06 Javascript
jQuery实现切换字体大小的方法
2015/03/10 Javascript
JavaScript中textRange对象使用方法小结
2015/03/24 Javascript
JavaScript 常见安全漏洞和自动化检测技术
2015/08/21 Javascript
关于Vue组件库开发详析
2018/07/01 Javascript
VUE v-for循环中每个item节点动态绑定不同函数的实例
2018/09/26 Javascript
支付宝小程序tabbar底部导航
2018/11/06 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
layui数据表格实现重载数据表格功能(搜索功能)
2019/07/27 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
如何将Node.js中的回调转换为Promise
2020/11/10 Javascript
详解如何用OpenCV + Python 实现人脸识别
2017/10/20 Python
Python with语句上下文管理器两种实现方法分析
2018/02/09 Python
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
2020/01/16 Python
python将字典内容写入json文件的实例代码
2020/08/12 Python
意大利拉斐尔时尚购物网:Raffaello Network(支持中文)
2018/11/09 全球购物
法国床上用品商店:La Compagnie du lit
2019/12/26 全球购物
介绍一下结构化程序设计方法和面向对象程序设计方法的区别
2012/06/27 面试题
大学生学习生活的自我评价
2013/11/01 职场文书
信息专业大学生自我评价分享
2014/01/17 职场文书
收银员的岗位职责范本
2014/02/04 职场文书
教导主任竞聘演讲稿
2014/05/16 职场文书
应用外语系自荐信
2014/06/26 职场文书
离婚协议书格式范本
2016/03/18 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书