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使用循环实现批量创建文件夹示例
Mar 25 Python
跟老齐学Python之再深点,更懂list
Sep 20 Python
Python 中的with关键字使用详解
Sep 11 Python
python subprocess 杀掉全部派生的子进程方法
Jan 16 Python
python 删除列表里所有空格项的方法总结
Apr 18 Python
Django 实现admin后台显示图片缩略图的例子
Jul 28 Python
python标记语句块使用方法总结
Aug 05 Python
python常用数据重复项处理方法
Nov 22 Python
安装PyInstaller失败问题解决
Dec 14 Python
Python生成词云的实现代码
Jan 14 Python
使用keras实现非线性回归(两种加激活函数的方式)
Jul 05 Python
python类共享变量操作
Sep 03 Python
Python爬虫实战之爬取京东商品数据并实实现数据可视化
Python实现的扫码工具居然这么好用!
Jun 07 #Python
忆童年!用Python实现愤怒的小鸟游戏
python单元测试之pytest的使用
Jun 07 #Python
Python趣味实战之手把手教你实现举牌小人生成器
怎么用Python识别手势数字
利用python调用摄像头的实例分析
Jun 07 #Python
You might like
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
2010/10/19 PHP
php中获取远程客户端的真实ip地址的方法
2011/08/03 PHP
php对数组排序代码分享
2014/02/24 PHP
PHP GD库生成图像的几个函数总结
2014/11/19 PHP
jquery复选框CHECKBOX全选、反选
2008/08/30 Javascript
js图片延迟加载的实现方法及思路
2013/07/22 Javascript
父元素与子iframe相互获取变量和元素对象的具体实现
2013/10/15 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
2014/05/28 Javascript
2种jQuery 实现刮刮卡效果
2015/02/01 Javascript
Bootstrap Table使用整理(三)
2017/06/09 Javascript
表格展示利器 Bootstrap Table实例代码
2017/09/06 Javascript
详解vue2 $watch要注意的问题
2017/09/08 Javascript
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
js实现一个简单的MVVM框架示例
2018/01/15 Javascript
浅谈KOA2 Restful方式路由初探
2019/03/14 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
vue动态注册组件实例代码详解
2019/05/30 Javascript
jQuery实现的记住帐号密码功能完整示例
2019/08/03 jQuery
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
python中OrderedDict的使用方法详解
2017/05/05 Python
python数字图像处理之高级滤波代码详解
2017/11/23 Python
Python+threading模块对单个接口进行并发测试
2019/06/25 Python
Apache部署Django项目图文详解
2019/07/30 Python
安装python及pycharm的教程图解
2019/10/10 Python
python异常处理和日志处理方式
2019/12/24 Python
python如何修改文件时间属性
2021/02/05 Python
CSS3实现类似翻书效果的过渡动画的示例代码
2019/09/06 HTML / CSS
利用CSS3实现开门效果实例源码
2016/08/22 HTML / CSS
Cynthia Rowley官网:全球领先的生活方式品牌
2020/10/27 全球购物
如何找出EMP表里面SALARY第N高的employee
2013/12/05 面试题
实习教师自我鉴定
2013/09/27 职场文书
本科应届生自荐信
2014/06/29 职场文书
村主任当选感言
2015/08/01 职场文书
大学生奶茶店创业计划书
2019/06/25 职场文书
加薪申请书应该这样写!
2019/07/04 职场文书
Python操作CSV格式文件的方法大全
2021/07/15 Python