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的一些用法分享
Oct 07 Python
十个Python程序员易犯的错误
Dec 15 Python
打包发布Python模块的方法详解
Sep 18 Python
Java与Python两大幸存者谁更胜一筹呢
Apr 12 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
Aug 23 Python
Python函数参数类型及排序原理总结
Dec 19 Python
python实现信号时域统计特征提取代码
Feb 26 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
Apr 07 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
Dec 16 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
Mar 03 Python
教你怎么用Python实现多路径迷宫
Apr 29 Python
详解在OpenCV中如何使用图像像素
Mar 03 Python
Python爬虫实战之爬取京东商品数据并实实现数据可视化
Python实现的扫码工具居然这么好用!
Jun 07 #Python
忆童年!用Python实现愤怒的小鸟游戏
python单元测试之pytest的使用
Jun 07 #Python
Python趣味实战之手把手教你实现举牌小人生成器
怎么用Python识别手势数字
利用python调用摄像头的实例分析
Jun 07 #Python
You might like
php的header和asp中的redirect比较
2006/10/09 PHP
如何利用PHP执行.SQL文件
2013/07/05 PHP
JavaScript OOP类与继承
2009/11/15 Javascript
JS自定义功能函数实现动态添加网址参数修改网址参数值
2013/08/02 Javascript
js replace 与replaceall实例用法详解
2013/08/03 Javascript
Javascript Memoizer浅析
2014/10/16 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
AngularJS自定义控件实例详解
2016/12/13 Javascript
js中的闭包学习心得
2018/02/06 Javascript
nodeJS进程管理器pm2的使用
2019/01/09 NodeJs
简单学习5种处理Vue.js异常的方法
2019/06/17 Javascript
layui实现三级导航菜单
2019/07/26 Javascript
JavaScript 反射和属性赋值实例解析
2019/10/28 Javascript
如何解决django配置settings时遇到Could not import settings 'conf.local'
2014/11/18 Python
利用Python实现网络测试的脚本分享
2017/05/26 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
使用Python实现正态分布、正态分布采样
2019/11/20 Python
python读取ini配置文件过程示范
2019/12/23 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
Django用户身份验证完成示例代码
2020/04/03 Python
如何利用Python写个坦克大战
2020/11/18 Python
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
手工制作的豪华英式沙发和沙发床:Willow & Hall
2019/05/03 全球购物
vue实现倒计时功能
2021/03/24 Vue.js
法制宣传标语集锦
2014/06/25 职场文书
批评与自我批评范文
2014/10/15 职场文书
个人政风行风自查自纠报告
2014/10/21 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
新婚姻法离婚协议书范文
2014/11/30 职场文书
交通事故死亡赔偿协议书
2014/12/03 职场文书
幼儿园工作总结2015
2015/04/01 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
建房合同协议书
2016/03/21 职场文书
Mysql 设置boolean类型的操作
2021/06/04 MySQL
以下牛机,你有几个
2022/04/05 无线电