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实现一个简单的MySQL类
Jan 07 Python
Python3里的super()和__class__使用介绍
Apr 23 Python
Python实现Linux的find命令实例分享
Jun 04 Python
Python发送http请求解析返回json的实例
Mar 26 Python
详解python异步编程之asyncio(百万并发)
Jul 07 Python
python爬虫超时的处理的实例
Dec 19 Python
python+opencv实现高斯平滑滤波
Jul 21 Python
django框架实现一次性上传多个文件功能示例【批量上传】
Jun 19 Python
Python常用模块logging——日志输出功能(示例代码)
Nov 20 Python
Python图像阈值化处理及算法比对实例解析
Jun 19 Python
Python如何解除一个装饰器
Aug 07 Python
python 装饰器重要在哪
Feb 14 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制作图型计数器的例子
2006/10/09 PHP
window+nginx+php环境配置 附配置搭配说明
2010/12/29 PHP
关于Zend Studio 配色方案插件的介绍
2013/06/24 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
2014/11/19 PHP
php插入排序法实现数组排序实例
2015/02/16 PHP
php操作xml并将其插入数据库的实现方法
2016/09/08 PHP
php微信开发之图片回复功能
2018/06/14 PHP
IE8 浏览器Cookie的处理
2009/01/31 Javascript
JS实现可改变列宽的table实例
2013/07/02 Javascript
jquery实现ajax提交form表单的方法总结
2014/03/03 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
2015/03/12 Javascript
整理Javascript基础语法学习笔记
2015/11/29 Javascript
javascript实现下拉提示选择框
2015/12/29 Javascript
javascript中select下拉框的用法总结
2016/01/07 Javascript
jQuery绑定自定义事件的魔法升级版
2016/06/30 Javascript
Angular2环境搭建具体操作步骤(推荐)
2017/08/04 Javascript
Java设计中的Builder模式的介绍
2018/03/22 Javascript
详解如何在Angular优雅编写HTTP请求
2018/12/05 Javascript
微信小程序页面间传递数组对象方法解析
2019/11/06 Javascript
JavaScript点击按钮生成4位随机验证码
2021/01/28 Javascript
利用Python绘制数据的瀑布图的教程
2015/04/07 Python
Python解析树及树的遍历
2016/02/03 Python
如何安装多版本python python2和python3共存以及pip共存
2018/09/18 Python
python matplotlib画图库学习绘制常用的图
2019/03/19 Python
如何在Python中实现goto语句的方法
2019/05/18 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
2019/06/03 Python
python实现宿舍管理系统
2019/11/22 Python
基于IE10/HTML5 开发
2013/04/22 HTML / CSS
浅谈html5增强的页面元素
2016/06/14 HTML / CSS
瑞贝卡·泰勒官方网站:Rebecca Taylor
2016/09/24 全球购物
英国顶级家庭折扣店:The Works
2017/09/06 全球购物
世界上最全面的草药补充剂和顶级品牌维生素网站:HerbsPro
2019/01/20 全球购物
精选鞋类、服装和配饰的全球领先目的地:Bodega
2021/02/27 全球购物
《小白兔和小灰兔》教学反思
2014/02/18 职场文书
防溺水安全教育主题班会
2015/08/12 职场文书
Python集合的基础操作
2021/11/01 Python