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 05 Python
python的类方法和静态方法
Dec 13 Python
Python 冒泡,选择,插入排序使用实例
Feb 05 Python
Python 类与元类的深度挖掘 II【经验】
May 06 Python
python读取中文txt文本的方法
Apr 12 Python
python3+PyQt5实现拖放功能
Apr 24 Python
Django实现分页功能
Jul 02 Python
python实现Virginia无密钥解密
Mar 20 Python
详解Python基础random模块随机数的生成
Mar 23 Python
PyTorch基本数据类型(一)
May 22 Python
Python中输入和输出(打印)数据实例方法
Oct 13 Python
python中导入 train_test_split提示错误的解决
Jun 19 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
destoon调用企业会员公司形象图片的实现方法
2014/08/21 PHP
PHP获取当前页面URL函数实例
2014/10/22 PHP
php使用Jpgraph绘制饼状图的方法
2015/06/10 PHP
zend框架实现支持sql server的操作方法
2016/12/08 PHP
redirect_uri参数错误的解决方法(必看)
2017/02/16 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
2017/05/05 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
Laravel 框架路由原理与路由访问实例分析
2020/04/14 PHP
JavaScript类库D
2010/10/24 Javascript
JQuery获取样式中的background-color颜色值的问题
2013/08/20 Javascript
jquery中的过滤操作详细解析
2013/12/02 Javascript
Javascript学习笔记之 函数篇(三) : 闭包和引用
2014/11/23 Javascript
Bootstrap实现弹性搜索框
2016/07/11 Javascript
jQuery自制提示框tooltip改进版
2016/08/01 Javascript
15款最好的Bootstrap在线编辑器
2016/08/03 Javascript
JavaScript中this的用法实例分析
2016/12/19 Javascript
Vue.js常用指令之循环使用v-for指令教程
2017/06/27 Javascript
Javascript中 toFixed四舍六入方法
2017/08/21 Javascript
Node.js引入UIBootstrap的方法示例
2018/05/11 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
2020/09/25 Javascript
深入解析Python编程中JSON模块的使用
2015/10/15 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
2018/07/19 Python
计算机二级python学习教程(2) python语言基本语法元素
2019/05/16 Python
Python之Django自动实现html代码(下拉框,数据选择)
2020/03/13 Python
构造器Constructor是否可被override?
2013/08/06 面试题
下面关于"联合"的题目的输出是什么
2013/08/06 面试题
Unix如何在一行中运行多个命令
2015/05/29 面试题
应届大学生的推荐信
2013/11/20 职场文书
三年大学生活自我鉴定
2014/01/21 职场文书
大学感恩节活动策划方案
2014/10/11 职场文书
交警正风肃纪剖析材料
2014/10/29 职场文书
祝酒词范文
2015/08/12 职场文书
关于企业的执行力标语大全
2020/01/06 职场文书
用php如何解决大文件分片上传问题
2021/07/07 PHP
python之django路由和视图案例教程
2021/07/26 Python
apache ftpserver搭建ftp服务器
2022/05/20 Servers