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版微信跳一跳游戏辅助
Jan 11 Python
python中logging模块的一些简单用法的使用
Feb 22 Python
Pandas分组与排序的实现
Jul 23 Python
Django框架 查询Extra功能实现解析
Sep 04 Python
python返回数组的索引实例
Nov 28 Python
Python selenium的基本使用方法分析
Dec 21 Python
python实现随机加减法生成器
Feb 24 Python
iPython pylab模式启动方式
Apr 24 Python
如何教少儿学习Python编程
Jul 10 Python
Python和Bash结合在一起的方法
Nov 13 Python
python 实现两个变量值进行交换的n种操作
Jun 02 Python
Python多线程实用方法以及共享变量资源竞争问题
Apr 12 Python
Python爬虫实战之爬取京东商品数据并实实现数据可视化
Python实现的扫码工具居然这么好用!
Jun 07 #Python
忆童年!用Python实现愤怒的小鸟游戏
python单元测试之pytest的使用
Jun 07 #Python
Python趣味实战之手把手教你实现举牌小人生成器
怎么用Python识别手势数字
利用python调用摄像头的实例分析
Jun 07 #Python
You might like
BBS(php & mysql)完整版(三)
2006/10/09 PHP
php防注
2007/01/15 PHP
php堆排序(heapsort)练习
2013/11/13 PHP
php批量转换文件夹下所有文件编码的函数类
2017/08/06 PHP
JavaScript中Array 对象相关的几个方法
2006/12/22 Javascript
JScript的条件编译
2007/05/29 Javascript
Javascript的闭包
2009/12/31 Javascript
JS Excel读取和写入操作(模板操作)实现代码
2010/04/11 Javascript
JS DOM 操作实现代码
2010/08/01 Javascript
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
2012/07/31 Javascript
jQuery渐变发光导航菜单的实例代码
2013/03/27 Javascript
Node.js 制作实时多人游戏框架
2015/01/08 Javascript
jquery SweetAlert插件实现响应式提示框
2015/08/18 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
Vue响应式添加、修改数组和对象的值
2017/03/20 Javascript
React-router v4 路由配置方法小结
2017/08/08 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
vue中v-text / v-html使用实例代码详解
2019/04/02 Javascript
使用Vue实现移动端左滑删除效果附源码
2019/05/16 Javascript
解决vue单页面多个组件嵌套监听浏览器窗口变化问题
2020/07/30 Javascript
Vue 使用typescript如何优雅的调用swagger API
2020/09/01 Javascript
python 正则式使用心得
2009/05/07 Python
Python实现求一个集合所有子集的示例
2018/05/04 Python
利用Python实现斐波那契数列的方法实例
2020/07/26 Python
python如何运行js语句
2020/09/09 Python
解决pytorch下出现multi-target not supported at的一种可能原因
2021/02/06 Python
基于html5 canvas实现漫天飞雪效果实例
2014/09/10 HTML / CSS
菲律宾领先的在线时尚商店:Zalora菲律宾
2018/02/08 全球购物
一道Delphi上机题
2012/06/04 面试题
师范学院毕业生求职信范文
2013/12/26 职场文书
《长城》教学反思
2014/02/14 职场文书
义和团口号
2014/06/17 职场文书
员工团队活动方案
2014/08/28 职场文书
优秀学生干部主要事迹材料
2015/11/04 职场文书
启迪人心的励志语录:脾气永远不要大于本事
2020/01/02 职场文书