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代码来解图片迷宫的方法整理
Apr 02 Python
Python中模块string.py详解
Mar 12 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
May 16 Python
Django logging配置及使用详解
Jul 23 Python
Centos7 下安装最新的python3.8
Oct 28 Python
np.dot()函数的用法详解
Jan 17 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
Jul 31 Python
python db类用法说明
Jul 07 Python
Python descriptor(描述符)的实现
Nov 15 Python
Python下载的11种姿势(小结)
Nov 18 Python
Python学习之包与模块详解
Mar 19 Python
Python加密与解密模块hashlib与hmac
Jun 05 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
hessian 在PHP中的使用介绍
2010/12/13 PHP
php获取bing每日壁纸示例分享
2014/02/25 PHP
使用php转义输出HTML到JavaScript
2015/03/27 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
2016/02/23 PHP
PHP自定义函数格式化json数据示例
2016/09/14 PHP
jquery序列化form表单使用ajax提交后处理返回的json数据
2014/03/03 Javascript
jQuery中removeData()方法用法实例
2014/12/27 Javascript
js随机生成网页背景颜色的方法
2015/02/26 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
Bootstrap模态框(modal)垂直居中的实例代码
2016/08/18 Javascript
使用vue框架 Ajax获取数据列表并用BootStrap显示出来
2017/04/24 Javascript
你有必要知道的10个JavaScript难点
2017/07/25 Javascript
vue插件mescroll.js实现移动端上拉加载和下拉刷新
2019/03/07 Javascript
node.js 基于 STMP 协议和 EWS 协议发送邮件
2021/02/14 Javascript
[01:05:41]EG vs Optic Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python简单实现计算过期时间的方法
2015/06/09 Python
使用Python+Splinter自动刷新抢12306火车票
2018/01/03 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
TensorFlow 读取CSV数据的实例
2020/02/05 Python
Python利用PyPDF2库获取PDF文件总页码实例
2020/04/03 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
2020/04/23 Python
Python中的全局变量如何理解
2020/06/04 Python
浅谈Python 命令行参数argparse写入图片路径操作
2020/07/12 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
2020/10/15 Python
英国领先的瓷砖专家:Walls and Floors
2018/04/27 全球购物
美国最大最全的亚洲购物网站:美国亚米网(Yamibuy)
2020/05/05 全球购物
销售员岗位职责范本
2014/02/03 职场文书
职业生涯规划书前言
2014/04/15 职场文书
环保建议书500字
2014/05/14 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
房产电话营销开场白
2015/05/29 职场文书
毕业论文指导老师意见
2015/06/04 职场文书
课题研究阶段性总结
2015/08/13 职场文书
2015年十月一日放假通知
2015/08/18 职场文书
python文件目录操作之os模块
2021/05/08 Python