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

作者:初学小白Lu 时间:2021-03-22 03:40:35 

一、通过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()

来源:https://blog.csdn.net/weixin_43956958/article/details/117445949

标签:python,函数名,调用,函数
0
投稿

猜你喜欢

  • python 执行函数的九种方法

    2021-03-10 18:12:08
  • asp伪继承初探_实例代码

    2011-04-19 10:32:00
  • Python字典,函数,全局变量代码解析

    2021-02-20 06:58:58
  • Python通过DOM和SAX方式解析XML的应用实例分享

    2023-10-15 10:46:32
  • CSS编写过程中常见的10个错误

    2008-05-29 12:49:00
  • Python爬虫之超级鹰验证码应用

    2021-04-08 08:22:20
  • 细品Dreamweaver MX 2004内建FW技术

    2010-09-02 12:38:00
  • Python+OCR实现文档解析的示例代码

    2023-11-22 02:34:19
  • python中安装Scrapy模块依赖包汇总

    2023-11-08 07:06:25
  • 在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南

    2022-03-04 21:11:24
  • python3 requests中文乱码之压缩格式问题解析

    2021-12-13 17:03:28
  • 使用Dreamweaver代码片断提高css开发效率

    2007-10-28 15:46:00
  • Python数据可视化 pyecharts实现各种统计图表过程详解

    2022-04-08 17:28:37
  • 在python中利用numpy求解多项式以及多项式拟合的方法

    2021-05-14 03:01:24
  • PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】

    2023-11-23 23:45:27
  • asp中判断是否是手机浏览器以及手机类型

    2014-12-06 09:33:05
  • asp防止盗链HTTP_REFERER判断代码

    2010-03-12 10:41:00
  • PyQt5实现界面(页面)跳转的示例代码

    2023-06-21 18:48:43
  • Python 完美解决 Import “模块“ could not be resolved ...的问题

    2022-04-05 18:59:29
  • 通过Python实现猜灯谜游戏的示例代码

    2022-01-10 17:49:40
  • asp之家 网络编程 m.aspxhome.com