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 时间处理datetime实例
Sep 06 Python
Windows中安装使用Virtualenv来创建独立Python环境
May 31 Python
Python采用Django制作简易的知乎日报API
Aug 03 Python
Python判断某个用户对某个文件的权限
Oct 13 Python
Python实现定时精度可调节的定时器
Apr 15 Python
Python 监测文件是否更新的方法
Jun 10 Python
python实现H2O中的随机森林算法介绍及其项目实战
Aug 29 Python
PyCharm GUI界面开发和exe文件生成的实现
Mar 04 Python
python为QT程序添加图标的方法详解
Mar 09 Python
django admin 添加自定义链接方式
Mar 11 Python
django 实现后台从富文本提取纯文本
Jul 02 Python
用Python制作音乐海报
Jan 26 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获取服务器信息的实现代码
2013/02/04 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
php中执行系统命令的方法
2015/03/21 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
Javascript实例教程(19) 使用HoTMetal(6)
2006/12/23 Javascript
获取当前网页document.url location.href区别总结
2008/05/10 Javascript
js控制的回到页面顶端goTop的代码实现
2013/03/20 Javascript
js动态拼接正则表达式的两种方法
2014/03/04 Javascript
javascript最基本的函数汇总
2015/06/25 Javascript
js数组如何添加json数据及js数组与json的区别
2015/10/27 Javascript
AngularJS基础 ng-paste 指令简单示例
2016/08/02 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
JavaScript数组去重由慢到快由繁到简(优化篇)
2016/08/26 Javascript
js实现二级导航功能
2017/03/03 Javascript
vue webpack实用技巧总结
2018/04/24 Javascript
react-navigation之动态修改title的内容
2018/09/26 Javascript
vue实现条件判断动态绑定样式的方法
2018/09/29 Javascript
对vuex中getters计算过滤操作详解
2019/11/06 Javascript
JavaScript实现tab栏切换效果
2020/03/16 Javascript
原生js实现移动小球(碰撞检测)
2020/12/17 Javascript
python常用知识梳理(必看篇)
2017/03/23 Python
Python实现列表删除重复元素的三种常用方法分析
2017/11/24 Python
kaggle+mnist实现手写字体识别
2018/07/26 Python
django小技巧之html模板中调用对象属性或对象的方法
2018/11/30 Python
Python实现将通信达.day文件读取为DataFrame
2018/12/22 Python
利用python在excel里面直接使用sql函数的方法
2019/02/08 Python
对Python Pexpect 模块的使用说明详解
2019/02/14 Python
pyqt实现.ui文件批量转换为对应.py文件脚本
2019/06/19 Python
python 图像插值 最近邻、双线性、双三次实例
2020/07/05 Python
高三语文教学反思
2014/01/15 职场文书
再婚婚前财产协议书范本
2014/10/19 职场文书
远程教育培训心得体会
2016/01/09 职场文书
化工生产实习心得体会
2016/01/22 职场文书
《钢铁是怎样炼成的》高中读后感
2019/08/07 职场文书
redis复制有可能碰到的问题汇总
2022/04/03 Redis
德生2P3收音机开箱评测
2022/04/30 无线电