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


猜你喜欢
- Dreamweaver从出道以来,其简便易用而又功能强大的“行为”(Behavior)一直是大家所关注的热点之一。在Dreamweaver
- mysql> select binary 'ABCD'='abcd' COM1, 'ABCD&
- 代码如下from bs4 import BeautifulSoup #网页解析,获取数据import sys #正则表达式,进行文字匹配im
- queue模块简介queue模块是Python内置的标准模块,模块实现了三种类型的队列,它们的区别仅仅是条目取回的顺序,分别由3个类进行表示
- 目录一、pyecharts绘制词云图WordCloud.add()方法简介二、绘制词云图对应轮廓按diamond显示三、对应完整代码如下所示
- 一、概述OLAP的系统(即Online Aanalyse Process)一般用于系统决策使用。通常和数据仓库、数据分析、数据挖掘等概念联系
- 基本命令显示版本信息pip -V安装指定包pip install <packages>pip install -i 'h
- ipad上可以运行python么?ipad上是可以运行python的。1、在我们的ipad上百度搜索Python,点击进去。2、进去网站之后
- 项目结构├── node_modules # 项目依赖包目录├── build &nb
- 前言有时候我们的小程序太大,首次打开小程序的时候回比较慢,这个时候我们可以试试分包操作。分包可以让用户在操作小程序的时候按需下载资源(用户在
- MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Win
- 1.什么是事务:事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时事务是做为最小的控制单元来使用的。他包含的所有数据库操作命令作
- LRU:least recently used,最近最少使用算法。它的使用场景是:在有限的空间中存储对象时,当空间满时,会按一定的原则删除原
- 最近在用python处理Excel表格是遇到了一些问题1, xlwt最多只能写入65536行数据, 所以在处理大批量数据的时候没法使用2,
- jQuery.post( url, [data], [callback], [type]
- 今天早上早些时候,在我的Planet Python源中,我读到了一篇有趣的文章"开发CARDIAC:纸板计算机(Developin
- 使用Django中遇到这样一个需求,对一个表的几个字段做 联合唯一索引,例如学生表中 姓名和班级 2个字段在一起表示一个唯一记录。Djang
- 需求:查询出满足3人及3案有关系的集合# -*- coding: utf-8 -*-from py2neo import Graphimpo
- 在《数据库原理》里面,对聚簇索引的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的解释是:索引顺序与数据物理排列顺序无关。正式
- 邹建 2004.4 代码如下:/*--调用示例 exec p_lockinfo1 --*/ alter proc p_lockinfo1