在之前用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}