是因为你的使用方法不对。这个方法是给实例绑定方法用的,用来不会影响到其他实例:
class Stu(object):def set_age(self,age):
self.age = 19
s=Stu()
a=Stu()
def set_age(self,age):
self.age = age
import types
a.set_age = types.MethodType(set_age, a)
a.set_age(15)
s.set_age(11)
print(s.age,a.age) # => (19, 15)
用MethodType方法更改了实例a的set_age方法,同类实例s并不受影响。
如果要给你一个类绑定方法:
class Stu(object):pass
s=Stu()
a=Stu()
def set_age(self,age):
self.age = age
import types
Stu.set_age = set_age
a.set_age(15)
s.set_age(11)
print(s.age,a.age)
这样直接绑定就可以了。
给你这样一个例子吧,这个例子里面有动态增加类的函数。声明一个类,类初始化的时候读取配置文件,根据配置列表加载特定目录下的模块下的函数,函数和模块同名,将此函数动态加载为类的成员函数。
代码如下所示:
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函数。