导读
有时候我们想要通过字符串
来直接调用函数,方便通过输入的参数来直接控制调用的函数
常规操作
def function1():
print("function1")
def function2():
print("function2")
def function3():
print("function3")
def call_fun_by_str(fun_str):
if fun_str == "function1":
function1()
elif fun_str == "function2":
function2()
elif fun_str == "function3":
function3()
call_fun_by_str("function2")
通过判断字符串是否等于函数名
,然后再来决定调用的函数。看起来感觉有那么一点点的多余,python作为追求简洁的语言,还提供了另外几种不同的方式通过字符串调用函数的方法。
eval函数
python内置的eval
函数可以将符合字典
、列表
、元祖
格式的字符串转换成字典
、列表
、元祖
a = "{'a':'10','b':'20'}"
print(type(a),type(eval(a)))
b = "[1,2,3]"
print(type(b),type(eval(b)))
c = "(4,5,6)"
print(type(c),type(eval(c)))
还能对字符串格式的表达式进行计算
a = "10*20"
print(eval(a))
b = "pow(3,3)"
print(eval(b))
除此之外,它还能直接通过函数名的字符串来调用函数
def function1():
print("function1")
def function2():
print("function2")
def function3():
print("function3")
def call_fun_by_str(fun_str):
eval(fun_str)()
call_fun_by_str("function2")
locals函数和globals函数
locals
和globals
函数提供了基于字典的访问局部和全局变量的方式
- locals函数:实际上没有返回局部名字空间,它返回的是一个拷贝。所以对它进行修改,修改的是拷贝,而对实际的局部名字空间中的变量值并无影响。
- globals函数:返回的是实际的全局名字空间,而不是一个拷贝与 locals 的行为完全相反。
a = 1
def demo():
x = 2
#修改局部变量
locals()["x"] = 200
print(x)#2
#修改全局变量
globals()["a"] = 100
print(a)#100
demo()
通过locals和globals调用函数
def function1():
print("function1")
def function2():
print("function2")
locals()["function1"]()
globals()["function2"]()
getattr函数
getattr
函数可以用来获取对象的属性值
参数介绍
:
- object – 对象,参数可以是
类对象
、模块名
、self
- name – 字符串,对象属性
- default – 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError
class Demo(object):
a = 100
def fun1(self):
print("fun1")
def fun2(self):
print("fun2")
def fun3(self):
#在类中调用另一个函数
getattr(self,"fun2")()
demo = Demo()
#调用类中的函数
getattr(demo,"fun1")()#fun1
getattr(demo,"fun3")()#fun2
#获取类中的属性值
print(getattr(demo,"a"))#100
#调用一个不存在的属性
print(getattr(demo,"b"))
#对于不存在的属性给一个默认值,避免抛出异常
print(getattr(demo,"b",10))#10
operator 的methodcaller
methodcaller
函数对getattr
函数进行了封装,底层的call
函数就调用getattr
函数
class Demo(object):
a = 100
def fun1(self):
print("fun1")
def fun2(self):
print("fun2")
def fun3(self):
#在类中调用另一个函数
getattr(self,"fun2")()
from operator import methodcaller
demo = Demo()
methodcaller("fun1")(demo)