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实现的二维码生成小软件
Jul 11 Python
Python使用urllib2模块抓取HTML页面资源的实例分享
May 03 Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
Aug 18 Python
python Flask 装饰器顺序问题解决
Aug 08 Python
python实现决策树分类
Aug 30 Python
wxpython+pymysql实现用户登陆功能
Nov 19 Python
Tensorflow训练MNIST手写数字识别模型
Feb 13 Python
Python3变量与基本数据类型用法实例分析
Feb 14 Python
python爬虫用mongodb的理由
Jul 28 Python
Python 如何创建一个简单的REST接口
Jul 30 Python
python3中TQDM库安装及使用详解
Nov 18 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
Feb 22 Python
Python爬虫实战之爬取京东商品数据并实实现数据可视化
Python实现的扫码工具居然这么好用!
Jun 07 #Python
忆童年!用Python实现愤怒的小鸟游戏
python单元测试之pytest的使用
Jun 07 #Python
Python趣味实战之手把手教你实现举牌小人生成器
怎么用Python识别手势数字
利用python调用摄像头的实例分析
Jun 07 #Python
You might like
第四节 构造函数和析构函数 [4]
2006/10/09 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
php实现MySQL数据库备份与还原类实例
2014/12/09 PHP
Yii2框架使用计划任务的方法
2016/05/25 PHP
使用PHP访问RabbitMQ消息队列的方法示例
2018/06/06 PHP
javascript重复绑定事件造成的后果说明
2013/03/02 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
Jquery实现图片预加载与延时加载的方法
2014/12/22 Javascript
JavaScript字符串常用类使用方法汇总
2015/04/14 Javascript
只要1K 纯JS脚本送你一朵3D红色玫瑰
2016/08/09 Javascript
Js调用Java方法并互相传参的简单实例
2016/08/11 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
Angularjs之如何在跨域请求中传输Cookie的方法
2018/06/01 Javascript
详解mpvue中小程序自定义导航组件开发指南
2019/02/11 Javascript
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
Vue多环境代理配置方法思路详解
2019/06/21 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
nodejs一个简单的文件服务器的创建方法
2019/09/13 NodeJs
解决elementui表格操作列自适应列宽
2020/12/28 Javascript
Python 开发Activex组件方法
2009/11/08 Python
Python抓取京东图书评论数据
2014/08/31 Python
python获取一组数据里最大值max函数用法实例
2015/05/26 Python
Windows下使Python2.x版本的解释器与3.x共存的方法
2015/10/25 Python
Python学习小技巧之列表项的排序
2017/05/20 Python
基于anaconda下强大的conda命令介绍
2018/06/11 Python
20行python代码的入门级小游戏的详解
2019/05/05 Python
关于Python形参打包与解包小技巧分享
2019/08/24 Python
对CSS3选择器的研究(详解)
2016/09/16 HTML / CSS
毕业生求职的求职信
2013/12/05 职场文书
大学生自我鉴定范文模板
2014/01/21 职场文书
计算机科学技术自荐信
2014/06/12 职场文书
经营理念标语
2014/06/21 职场文书
公安交警中队队长个人对照检查材料思想汇报
2014/10/05 职场文书
大学生团员个人总结
2015/02/14 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书
Tomcat starup.bat 脚本实现开机自启动
2022/04/20 Servers