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下的XSLT API进行web开发的简单教程
Apr 15 Python
Python的Bottle框架中返回静态文件和JSON对象的方法
Apr 30 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
Apr 24 Python
Pyqt5 基本界面组件之inputDialog的使用
Jun 25 Python
Python实现蒙特卡洛算法小实验过程详解
Jul 12 Python
原来我一直安装 Python 库的姿势都不对呀
Nov 11 Python
3种python调用其他脚本的方法
Jan 06 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
Apr 20 Python
终于搞懂了Keras中multiloss的对应关系介绍
Jun 22 Python
推荐值得学习的12款python-web开发框架
Aug 10 Python
python subprocess pipe 实时输出日志的操作
Dec 05 Python
selenium与xpath之获取指定位置的元素的实现
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
Yii2 rbac权限控制之菜单menu实例教程
2016/04/28 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
2017/05/30 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
php实现微信原生支付(扫码支付)功能
2018/05/30 PHP
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
Script标签与访问HTML页面详解
2014/01/10 Javascript
JQuery实现table行折叠效果以JSON做数据源
2014/05/26 Javascript
JavaScript中使用Object.create()创建对象介绍
2014/12/30 Javascript
JQuery页面地址处理插件jqURL详解
2015/05/03 Javascript
Bootstrap自定义文件上传下载样式
2016/05/26 Javascript
浅谈JS继承_借用构造函数 & 组合式继承
2016/08/16 Javascript
Js获取当前日期时间及格式化代码
2016/09/17 Javascript
Redux 和 Mobx的选择问题:让你不再困惑!
2017/09/18 Javascript
微信小程序中post方法与get方法的封装
2017/09/26 Javascript
AngularJS实现表单验证功能详解
2017/10/12 Javascript
Angular 开发学习之Angular CLI的安装使用
2017/12/31 Javascript
jQuery中常用动画效果函数知识点整理
2018/08/19 jQuery
Web安全之XSS攻击与防御小结
2018/12/13 Javascript
原生js实现无缝轮播图
2020/01/11 Javascript
[55:39]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第二场 1月19日
2021/03/11 DOTA
django 自定义用户user模型的三种方法
2014/11/18 Python
浅谈django orm 优化
2018/08/18 Python
python将一个英文语句以单词为单位逆序排放的方法
2018/12/20 Python
python搜索包的路径的实现方法
2019/07/19 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
2020/03/18 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
2020/05/04 Python
浅谈Python程序的错误:变量未定义
2020/06/02 Python
Python3如何实现Win10桌面自动切换
2020/08/11 Python
C#如何进行LDAP用户校验
2012/11/21 面试题
卫校护理专业毕业生求职信
2013/11/26 职场文书
客服部班长工作责任制
2014/02/25 职场文书
企业总经理任命书
2014/06/05 职场文书
大学毕业典礼演讲稿
2014/09/09 职场文书
2016年入党心得体会范文
2016/01/23 职场文书
Python中使用Opencv开发停车位计数器功能
2022/04/04 Python
Python中使用tkFileDialog实现文件选择、保存和路径选择
2022/05/20 Python