python虽然也是脚本,但是更像java一些,没有perl那样的黑魔法。有函数引用,但是没有解引用。
只能通过字典来实现一般函数的反射。不过python的重点在于模块。
对于模块,可以通过__import__来动态加载。
对于模块内的函数调用,python提供了一系列辅助函数(getattr,hasattr等)
#encoding=GBK
#python 的 函数 反射
def hello(n):
print("hello"+n)
func =lambda n: hello(n) #匿名函数引用
func('1')
fun2=hello #函数引用
fun2('2')
fun={}
fun['hello']=hello #注册函数引用到字典
fname='hello'
fun[fname]('3')
from foo import bar
bar(1)
mname="foo"
mo = __import__(mname,fromlist = True) #加载当前目录下的模块
fname="bar"
f = getattr(mo,fname,None) #查找对应函数
f(2)
m2="timp.f6"
mo2 = __import__(m2,fromlist = True) #加载子目录下的模块
fname2="f6"
f1 = getattr(mo2,fname2,None) #查找对应函数
f1('3')
fun['bar']=bar
fname='bar'
fun[fname]('3')
__import__实现好像有些问题,没法实现from . import mo这样的相对引用
改为importlib就好了
import importlib
importlib.import_module(".d3.f3",package=__package__)
相对引用必需在包里运行。用python -m lib.f1 运行
python的eval和exec是分开的。
可以用来实现变量的反射
s1="123"
a=eval(s1)
print(a)
def add(a,b):
return a+b
s2="add(3,4)"
b=eval(s2)
print(b)
s3="aaa"
v=3
exec("aaa=v")
c=eval(s3)
print(c)