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 04 Python
Python时间获取及转换知识汇总
Jan 11 Python
Python探索之pLSA实现代码
Oct 25 Python
Python实现的直接插入排序算法示例
Apr 29 Python
详解Django rest_framework实现RESTful API
May 24 Python
Python3非对称加密算法RSA实例详解
Dec 06 Python
python 输出列表元素实例(以空格/逗号为分隔符)
Dec 25 Python
关于tf.TFRecordReader()函数的用法解析
Feb 17 Python
Python多进程编程常用方法解析
Mar 26 Python
Python日志logging模块功能与用法详解
Apr 09 Python
Python创建简单的神经网络实例讲解
Jan 04 Python
Python 视频画质增强
Apr 28 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常用字符串处理函数实例分析
2014/11/22 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
php 修改上传文件大小限制实例详解
2016/10/23 PHP
JS获取浏览器版本及名称实现函数
2013/04/02 Javascript
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
javascript 中that的含义示例介绍
2014/05/14 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
JavaScript数组常用操作技巧汇总
2014/11/17 Javascript
js继承call()和apply()方法总结
2014/12/08 Javascript
JS中this上下文对象使用方式
2016/10/09 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
react 父组件与子组件之间的值传递的方法
2017/09/14 Javascript
详解angularjs 学习之 scope作用域
2018/01/15 Javascript
vue-cli常用设置总结
2018/02/24 Javascript
vue 过滤器filter实例详解
2018/03/14 Javascript
推荐15个最好用的JavaScript代码压缩工具
2019/02/13 Javascript
小程序自定义单页面、全局导航栏的实现代码
2019/03/15 Javascript
详解js获取video任意时间的画面截图
2019/04/17 Javascript
js逆向解密之网络爬虫
2019/05/30 Javascript
Python操作sqlite3快速、安全插入数据(防注入)的实例
2014/04/26 Python
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
Python面向对象之接口、抽象类与多态详解
2018/08/27 Python
解决pycharm安装后代码区不能编辑的问题
2018/10/28 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
2019/07/25 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
Python如何用filter函数筛选数据
2020/03/05 Python
解决python脚本中error: unrecognized arguments: True错误
2020/04/20 Python
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
业务部主管岗位职责
2014/01/29 职场文书
班组建设经验交流材料
2014/05/12 职场文书
高中教师先进事迹材料
2014/08/22 职场文书
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书
教师反邪教心得体会
2016/01/15 职场文书
详细了解MVC+proxy
2021/07/09 Java/Android