1、打开python开发工具IDLE,新建‘pdt.py’文件,编写代码如下:class mytest(): def __init__(self,name): self.name = namemt1 = mytest('张三')print (mt1.name)
2、F5运行程序,打印出mytest类对象mt1的name字段。
3、通过setattr,动态改变mt1对象的name字段值,代码如下:class mytest(): def __init__(self,name): self.name = namemt1 = mytest('张三')print (mt1.name)setattr(mt1,"name",'李四')print (mt1.name)
4、F5运行程序,打印出mytest类对象mt1的name字段‘张三’,以及动态改变之后的‘李四’
5、接下来写一个复杂点的类中的函数,在调用时候动漤逗庞俄态改变,代码如下;class mytest: def 忧溲枷茫__init__(self,name): self.name = name def before(self): print ('before school') def after(self): print ('after school')class myparpre: def __init__(self,target): self.target = target def __getattribute__(self,name): target = object.__getattribute__(self,'target') atr = object.__getattribute__(target,name) if name == 'before': def fun(*args,**kwargs): print ('school bag') result = atr(*args,**kwargs) return result return fun else: return atr解释一下: myparpre类的对象调用一个方法,或者访问一个字段的时候,都会通过__getattribute__先找到这个对象的变量target,这个变量就是传入的mt1,再通过__getattribute__找到mt1的方法,就可以在mt1方法执行前或执行后,做操作了
6、添加代码进行方法调用,完整代码如下:class myte衡痕贤伎st: def __init__(self,name): self.na罪焐芡拂me = name def before(self): print ('before school') def after(self): print ('after school')class myparpre: def __init__(self,target): self.target = target def __getattribute__(self,name): target = object.__getattribute__(self,'target') atr = object.__getattribute__(target,name) if name == 'before': def fun(*args,**kwargs): print ('school bag') result = atr(*args,**kwargs) return result return fun else: return atr mt1 = mytest('张三')mp1 = myparpre(mt1)mp1.before()print ('-------')mp1.after()
7、F5运行程序,可以看到在执行before函数前做了新操作,而after函数没有变化