[python]python的反射

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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值