python通过函数名调用函数的几种方法总结


Posted in Python onJune 07, 2021

一、通过eval实现

 常用内置函数

(不用import就可以直接使用) :

  • help(obj) 在线帮助, obj可是任何类型
  • callable(obj) 查看一个obj是不是可以像函数一样调用
  • repr(obj) 得到obj的表示字符串,可以利用这个字符串
  • eval重建该对象的一个拷贝
  • eval_r(str) 表示合法的python表达式,返回这个表达式
  • dir(obj) 查看obj的name space中可见的name
  • hasattr(obj,name) 查看一个obj的name space中是否有name
  • getattr(obj,name) 得到一个obj的name space中的一个name
  • setattr(obj,name,value) 为一个obj的name space中的一个name指向vale这个object
  • delattr(obj,name) 从obj的name space中删除一个name vars(obj) 返回一个object的name
  • space。用dictionary表示
  • locals() 返回一个局部name space,用dictionary表示
  • globals() 返回一个全局name space,用dictionary表示
  • type(obj) 查看一个obj的类型
  • isinstance(obj,cls) 查看obj是不是cls的instance
  • issubclass(subcls,supcls) 查看subcls是不是supcls的子类

1.通过eval调用同一个类内的函数 eval()使用原因:

1)在编译语言里要动态地产生代码,基本上是不可能的,但动态语言是可以,意味着软件已经部署到服务器上了,但只要作很少的更改,只好直接修改这部分的代码,就可立即实现变化,不用整个软件重新加载。

2)在machin learning里根据用户使用这个软件频率,以及方式,可动态地修改代码,适应用户的变化。

eval()函数

eval(expression[, globals[, locals]])
  • expression ? 表达式。
  • globals ? 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
  • locals ? 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

返回传入字符串的表达式的结果

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.通过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实现

getattr() 函数用于返回一个对象属性值。语法如下:

getattr(object, name[, default])
  • object ? 对象。
  • name ? 字符串,对象属性。
  • default ? 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。

getattr(object, name) = object.name
getattr(a, ‘b')的作用就和a.b是一样的

示例:

result = obj.method(args)
 
// 使用getattr
func = getattr(obj, "method")
result = func(args)
// 或者写成一行
result = getattr(obj, "method")(args)

主要有两种异常,异常的安全用法:
AttributeError:对象中没有该属性。

try:
    func = getattr(obj, "method")
except AttributeError:
    ...... deal
else:
    result = func(args)
 
// 或指定默认返回值
func = getattr(obj, "method", None)
if func:
    func(args)

TypeError: 不可调用

func = getattr(obj, "method", None)
if callable(func):
    func(args)

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()

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.通过函数名调用同文件的一级函数

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()

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中调用ggplot的三种方法
Apr 08 Python
Python随机生成数模块random使用实例
Apr 13 Python
简单分析Python中用fork()函数生成的子进程
May 04 Python
python 实现自动远程登陆scp文件实例代码
Mar 13 Python
python实现树形打印目录结构
Mar 29 Python
python贪婪匹配以及多行匹配的实例讲解
Apr 19 Python
Python 移动光标位置的方法
Jan 20 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
May 23 Python
python 伯努利分布详解
Feb 25 Python
基于python实现操作redis及消息队列
Aug 27 Python
Python自定义sorted排序实现方法详解
Sep 18 Python
django如何自定义manage.py管理命令
Apr 27 Python
Python爬虫实战之爬取京东商品数据并实实现数据可视化
Python实现的扫码工具居然这么好用!
Jun 07 #Python
忆童年!用Python实现愤怒的小鸟游戏
python单元测试之pytest的使用
Jun 07 #Python
Python趣味实战之手把手教你实现举牌小人生成器
怎么用Python识别手势数字
利用python调用摄像头的实例分析
Jun 07 #Python
You might like
php中的一个中文字符串截取函数
2007/02/14 PHP
主流PHP框架的优缺点对比分析
2014/12/25 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
JS window.opener返回父页面的应用
2009/10/24 Javascript
js跳转页面方法实现汇总
2014/02/11 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
JSON.parse()和JSON.stringify()使用介绍
2014/06/20 Javascript
JavaScript通过join函数连接数组里所有元素的方法
2015/03/20 Javascript
Javascript技术栈中的四种依赖注入小结
2016/02/27 Javascript
Extjs实现下拉菜单效果
2016/04/01 Javascript
Kindeditor单独调用多图上传实例
2017/07/31 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】
2017/08/18 jQuery
webpack引入eslint配置详解
2018/01/22 Javascript
在vue中使用vant TreeSelect分类选择组件操作
2020/11/02 Javascript
[03:52]显微镜下的DOTA2第三期——英雄在无聊的时候干什么
2014/06/20 DOTA
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
跟老齐学Python之从if开始语句的征程
2014/09/14 Python
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
查找python项目依赖并生成requirements.txt的方法
2018/07/10 Python
python实现小程序推送页面收录脚本
2020/04/20 Python
keras在构建LSTM模型时对变长序列的处理操作
2020/06/29 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
amazeui 验证按钮扩展的实现
2020/08/21 HTML / CSS
凯特·丝蓓英国官网:Kate Spade英国
2016/11/07 全球购物
KIKO比利时官网:意大利彩妆品牌
2017/07/23 全球购物
澳大利亚墨尔本的在线时装店:LORETA
2018/09/14 全球购物
印度尼西亚手表和包包商店:Urban Icon
2019/12/12 全球购物
jQuery treeview树形结构应用
2021/03/24 jQuery
好的自荐信的要求
2013/10/30 职场文书
利群广告词
2014/03/20 职场文书
工作时间擅自离岗检讨书
2014/10/24 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
承诺函格式模板
2015/01/21 职场文书
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
2021/06/29 Python