在之前用sgmllib解析网页的时候遇到了·def do_a(self,attr)·这类的函数,可以自动识别<a>并解析其中内容。 在看learningpythonthehardway时也遇到了render.index()之类的随着url路由而变化的函数名。 遂思考,怎么才能实现这种
动态的函数名
呢?
在使用Java、C、C#等其他语言时,并没有这类的功能。有可能是python独有功能,遂百度,未发现相关介绍。 python为动态语言,且为面向对象语言,一切为对象。函数也是一个对象,那么函数也应该可以像普通的变量一样,增加一个引用。
import sys
class A:
def __init__(self,str):
self.str=str
setattr(self.__class__,self.str,self.test)
def test(self):
print sys._getframe().f_code.co_name
print self.str
if __name__=='__main__':
a=A("haha")
a.haha()
dynamicfunction.py
import sys
names=locals()
#print locals()
str1=''
def test(str):
global str1
str1=str
names[str1]=test2
def test2():
print sys._getframe().f_code.co_name
print str1
test2
例1,定义一个A类,然后实例化一个A对象,通过setattr函数来给当前类添加一个变量,值是test函数。调用haha函数,就相当于调用了test函数。 例2,定义一个模块,通过另一个模块函数调用函数来增加变量,值是test2函数。调用haha函数,就相当于调用了test2函数。
python系统会维护一个变量的字典,可以通过locals()或者globals()获取到该字典。由于字典是可变对象,那么,就可以动态的增加变量。由于函数也是一个对象,那么就可以将变量指向函数。这样就可以达到动态修改函数名的目的了。
locals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}