python动态修改函数名

困惑

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

  

时间: 2024-08-02 09:52:58

python动态修改函数名的相关文章

SQL SERVER修改函数名引起的问题

1. 问题 今天遇到一个奇怪的问题:使用sp_helptext XXX查询出来的函数定义名竟然跟函数名不同,而sp_helptext实际是查询sys.all_sql_modules这个系统视图的.直接查询这个视图的definition字段,发现跟sp_helptext是一样的.难道是系统视图也存在缓存之类的机制?或者是个BUG?对于第一个问题,当时情况紧急,没有时间去求证是否存在了.第二个问题,我想没什么可能,SQL SERVER发展到今天(SQL 2016正式版准备推出,我使用的环境则是SQL

Python 动态创建函数【转】

知乎上也有相似的问题 偶然碰到一个问题,初想是通过动态创建Python函数的方式来解决,于是调研了动态创建Python函数的方法. 定义lambda函数 在Python中定义lambda函数的写法很简单, func = lambda: "foobar" 可以认为lambda函数是最常用的一种方式. 定义局部函数 Python中函数可以在代码块中进行定义,比如decorator就是通过这种方式实现的, def decorator(func): def _(*args, **kwargs)

python中修改函数内部的变量会发生什么

最近写python遇到个函数内部变量使用外部变量的问题,现在总结下吧 #!/usr/bin/env python a = 100def su(): a = a + 1 print(a) s = su() #执行这段代码会报错(如果只是调用不修改是不会报错的) 更改为: #!/usr/bin/env python a = 100def su(): global a a = a + 1 print(a) s = su() 总结: 在python的函数中和全局同名的变量,如果修改变量的值就会变成局部变

python 打印调用函数名和文件名

import inspect import sys def get_current_function_name(): funcName = sys._getframe().f_back.f_code.co_name # 获取调用函数名 print(dir(sys._getframe())) print(dir(sys._getframe().f_back.f_code.co_filename)) print(sys._getframe().f_back.f_code.co_filename,"#

【Python】动态获取python类名、函数名&amp;多线程

import time import random import threading import inspect def get_current_function_name(): return inspect.stack()[1][3] class Inclass: def __init__(self): print 'Inclass 初始化' def execIn(self,i): rand = int(random.random() * 10) print i,'[%s.%s]---%s-

python 动态调用函数

1. 根据字符串名称 动态调用 python文件内的方法eval("function_name")(参数) 2. 根据字符串 动态调用类中的静态方法,getattr(ClassName,"function_name")(参数) 3. apply(functoin_name,parameters)  这个function_name不是字符串,而是函数对象本身:parameters是参数,类似(a,b,...)这样的格式 4. 当函数不确定参数的数目时候,采用 一个 *

python 批量修改包名

#coding=utf-8 import os #import re # 设置编码为utf-8 否则会报错..这时候 sublime控制台会报乱码.但是别担心,utf-8 文件 并不会报错 import sys reload(sys) sys.setdefaultencoding( "utf-8" ) #基础包名 basePackage='com.emark.base.注解' #基于基础包名的基本路径名,这里必须是unicode 打开....我也不知道为何别的字符串不用这样写....,

python 批量修改主机名

公司需要新上项目,上架20台机器,要对这些主机进行改名 #!/usr/bin/env python from multiprocessing import Process, Pool import paramiko import sys,os s = paramiko.SSHClient() s.load_system_host_keys() s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) def ssh_run(host_info

python动态调用函数

callmap = {ts.get_stock_basics: 'D:/dxw/code/all.csv', ts.get_sz50s: 'D:/dxw/code/50.csv', ts.get_hs300s: 'D:/dxw/code/300.csv', ts.get_zz500s: 'D:/dxw/code/500.csv'} def updatecode(): # 更新全部 index = 0 for callfunc in callmap.keys(): df = callfunc()