标签:
在之前用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()
结果:
test 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 haha
例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}
locals()[‘a‘]=1a
结果:
1
标签:
原文地址:http://www.cnblogs.com/TryTheBest/p/5011561.html