码迷,mamicode.com
首页 > 编程语言 > 详细

python动态修改函数名

时间:2015-12-02 00:37:07      阅读:552      评论:0      收藏:0      [点我收藏+]

标签:

困惑

在之前用sgmllib解析网页的时候遇到了·def do_a(self,attr)·这类的函数,可以自动识别<a>并解析其中内容。 在看learningpythonthehardway时也遇到了render.index()之类的随着url路由而变化的函数名。 遂思考,怎么才能实现这种动态的函数名呢?

研究

在使用Java、C、C#等其他语言时,并没有这类的功能。有可能是python独有功能,遂百度,未发现相关介绍。 python为动态语言,且为面向对象语言,一切为对象。函数也是一个对象,那么函数也应该可以像普通的变量一样,增加一个引用。

测试

例1

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

  

例2

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‘]=1
a 

  

结果:

1

  

python动态修改函数名

标签:

原文地址:http://www.cnblogs.com/TryTheBest/p/5011561.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!