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 相关文章推荐
Cpy和Python的效率对比
Mar 20 Python
Python数据结构之双向链表的定义与使用方法示例
Jan 16 Python
python编写弹球游戏的实现代码
Mar 12 Python
python实现猜单词小游戏
May 22 Python
基于wxPython的GUI实现输入对话框(1)
Feb 27 Python
Python如何爬取实时变化的WebSocket数据的方法
Mar 09 Python
Python当中的array数组对象实例详解
Jun 12 Python
Python数据分析pandas模块用法实例详解
Nov 20 Python
python 使用递归的方式实现语义图片分割功能
Jul 16 Python
python3 re返回形式总结
Nov 20 Python
Python实现简繁体转换
Jun 07 Python
Python基本的内置数据类型及使用方法
Apr 13 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实现检测客户端是否使用代理服务器及其匿名级别
2015/01/07 PHP
php中JSON的使用方法
2015/04/30 PHP
向大师们学习Javascript(视频与PPT)
2009/12/27 Javascript
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
一个JQuery操作Table的代码分享
2012/03/30 Javascript
动态加载script文件的两种方法
2013/08/15 Javascript
javascript二维数组转置实例
2015/01/22 Javascript
详解基于Bootstrap扁平化的后台框架Ace
2015/11/27 Javascript
jQuery多文件异步上传带进度条实例代码
2016/08/16 Javascript
Nodejs进阶:基于express+multer的文件上传实例
2016/11/21 NodeJs
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
JS倒计时实例_天时分秒
2017/08/22 Javascript
vee-validate vue 2.0自定义表单验证的实例
2018/08/28 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
2018/09/27 Javascript
ES6知识点整理之模块化的应用详解
2019/04/15 Javascript
JavaScript中关于base64的一些事
2019/05/06 Javascript
Vue filter 过滤当前时间 实现实时更新效果
2019/12/20 Javascript
[33:15]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VP VS Mineski
2018/03/31 DOTA
python 实现在txt指定行追加文本的方法
2018/04/29 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
2018/06/11 Python
Python设计模式之建造者模式实例详解
2019/01/17 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
python同步两个文件夹下的内容
2019/08/29 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
2020/04/20 Python
Python-jenkins模块获取jobs的执行状态操作
2020/05/12 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
Python爬取数据并实现可视化代码解析
2020/08/12 Python
python工具——Mimesis的简单使用教程
2021/01/16 Python
ASP.NET Core中的配置详解
2021/02/05 Python
python利用xpath爬取网上数据并存储到django模型中
2021/02/26 Python
工程管理英文求职信
2014/03/18 职场文书
python必学知识之文件操作(建议收藏)
2021/05/30 Python
「睡美人」爱洛公主粘土人开订
2022/03/22 日漫
python​格式化字符串
2022/04/20 Python
Win11显卡控制面板打开显卡设置方法
2022/04/20 数码科技