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计算一个文件里字数的方法
Jun 15 Python
基于Python3 逗号代码 和 字符图网格(详谈)
Jun 22 Python
Python环境搭建之OpenCV的步骤方法
Oct 20 Python
Python实现的质因式分解算法示例
May 03 Python
python实现pdf转换成word/txt纯文本文件
Jun 07 Python
python生成带有表格的图片实例
Feb 03 Python
python中pytest收集用例规则与运行指定用例详解
Jun 27 Python
Python封装成可带参数的EXE安装包实例
Aug 24 Python
Python如何使用BeautifulSoup爬取网页信息
Nov 26 Python
tensorflow 大于某个值为1,小于为0的实例
Jun 30 Python
基于python实现计算两组数据P值
Jul 10 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
Jan 24 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环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
2011/10/17 PHP
ajax php传递和接收变量实现思路及代码
2012/12/19 PHP
php获取文章上一页与下一页的方法
2014/12/01 PHP
php查询及多条件查询
2017/02/26 PHP
php实现的redis缓存类定义与使用方法示例
2017/08/09 PHP
IE下使用cloneNode注意事项分享
2012/11/22 Javascript
js实现点击注册按钮开始读秒倒计时的小例子
2013/05/11 Javascript
利用div+jquery自定义滚动条样式的2种方法
2013/07/18 Javascript
javascript完美拖拽的实现方法
2013/09/29 Javascript
AngularJS自定义服务与fliter的混合使用
2016/11/24 Javascript
jquery插件bootstrapValidator表单验证详解
2016/12/15 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
2018/02/09 Javascript
代码详解javascript模块加载器
2018/03/04 Javascript
node实现的爬虫功能示例
2018/05/04 Javascript
vue .sync修饰符的使用详解
2018/06/15 Javascript
vue 项目地址去掉 #的方法
2018/10/20 Javascript
vue自定义指令的创建和使用方法实例分析
2018/12/04 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
2019/03/06 jQuery
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
2020/08/15 Javascript
JS实现纸牌发牌动画
2021/01/19 Javascript
探究Python的Tornado框架对子域名和泛域名的支持
2015/05/02 Python
在Django框架中设置语言偏好的教程
2015/07/27 Python
利用Python实现命令行版的火车票查看器
2016/08/05 Python
CentOS6.5设置Django开发环境
2016/10/13 Python
python的numpy模块安装不成功简单解决方法总结
2017/12/23 Python
Python中文件的读取和写入操作
2018/04/27 Python
基于K.image_data_format() == 'channels_first' 的理解
2020/06/29 Python
班长岗位职责
2013/11/10 职场文书
信息专业毕业生五年职业规划参考
2014/02/06 职场文书
经贸专业毕业生求职信
2014/03/23 职场文书
《蜗牛的奖杯》教后反思
2014/04/24 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
一文搞懂python异常处理、模块与包
2021/06/26 Python
python中 .npy文件的读写操作实例
2022/04/14 Python
HTML5之高度塌陷问题的解决
2022/06/01 HTML / CSS