十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
定义一个A类,然后实例化一个A对象,通过setattr函数来给当前类添加一个变量,值是test函数。调用haha函数,就相当于调用了test函数。 例2,定义一个模块,通过另一个模块函数调用函数来增加变量,值是test2函数。调用haha函数,就相当于调用了test2函数。
创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、网站制作、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的竹溪网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
原理
python系统会维护一个变量的字典,可以通过locals()或者globals()获取到该字典。由于字典是可变对象,那么,就可以动态的增加变量。由于函数也是一个对象,那么就可以将变量指向函数。这样就可以达到动态修改函数名的目的了。
给你这样一个例子吧,这个例子里面有动态增加类的函数。
声明一个类,类初始化的时候读取配置文件,根据配置列表加载特定目录下的模块下的函数,函数和模块同名,将此函数动态加载为类的成员函数。
代码如下所示:
class WinBAS(Bas):
def __init__(self):
self.__baslist = {}
self.__Init_Modules()
pass
def __Init_Modules(self):
import modplugs
for m in modplugs.__moduleset__:
mh = __import__('modules.' + m)# + '.' + m)
ma = getattr(mh, m)# + '.' + m)
ma = getattr(ma, m)
setattr(self.__class__, m, ma)
modplugs.py是模块配置文件如下:
__moduleset__ = [
'BAS_GetUserList',
]
然后建立目录modules下面建立一个空的__init__.py文件,把目录变为一个包,在modules目录下建立真正的BAS_GetUserList实现:BAS_GetUserList文件中有个BAS_GetUserList函数如下:
def BAS_GetUserList(self, strs):
return [0, strs]
这样WinBAS类就可以动态加入了BAS_GetUserList函数。
你好,方法如下:
要写一个程序,让linuxany1=1,linuxany2=2,… inuxany100=100,你会怎么做?
最容易想到的自然是eval,但是实际上根本不需要这种危险的东西,因为Python的变量名就是一个字典的key而已。要获取这个字典,直接用locals和globals函数即可。
names = locals()
for i in xrange(1, 101):
... names['linuxany%s' % i] = i
... linuxany1
1 linuxany2
2 linuxany100
100
不过你也许会说这个例子没什么用,毕竟用数组来实现更为实用。
举一个例子:服务器使用一种对象数据库,可以直接保存对象到数据库中。服务器列出目前支持的所有类,而用户想添加一个不存在于列表中的类,于是向服务器发送一段JSON或XML文本。服务器解析这段文本,将它转换成一个class对象,并且设置类名。之后用户就可以随意生成这个类的对象。
关键是这个数据库和类名相关,你不能用一个通用的Object类来保存所有的对象,否则查询时就乱套了。
除了动态设置变量名,动态删除也是可以的,例如
del locals()['linuxany1']
同样,delattr也是可用的。
希望能帮到你。