一、通过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()函数
1
|
eval (expression[, globals [, locals ]]) |
- expression – 表达式。
- globals – 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
- locals – 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
返回传入字符串的表达式的结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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调用同一个文件内的一级函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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() 函数用于返回一个对象属性值。语法如下:
1
|
getattr ( object , name[, default]) |
- object – 对象。
- name – 字符串,对象属性。
- default – 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。
getattr(object, name) = object.name
getattr(a, ‘b')的作用就和a.b是一样的
示例:
1
2
3
4
5
6
7
|
result = obj.method(args) / / 使用 getattr func = getattr (obj, "method" ) result = func(args) / / 或者写成一行 result = getattr (obj, "method" )(args) |
主要有两种异常,异常的安全用法:
AttributeError:对象中没有该属性。
1
2
3
4
5
6
7
8
9
10
11
|
try : func = getattr (obj, "method" ) except AttributeError: ...... deal else : result = func(args) / / 或指定默认返回值 func = getattr (obj, "method" , None ) if func: func(args) |
TypeError: 不可调用
1
2
3
|
func = getattr (obj, "method" , None ) if callable (func): func(args) |
1.通过函数名调用同一个类内的函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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.通过函数名调用其他类的函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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.通过函数名调用同文件的一级函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
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.通过函数名调用在其他文件的一级函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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通过函数名调用函数内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/weixin_43956958/article/details/117445949