Python动态语言特性简单例子
1、打开python开发工具IDLE,新建‘pdt.py’文件,编写代码如下:
class mytest():
def __init__(self,name):
self.name = name
mt1 = mytest('张三')
print (mt1.name)

2、F5运行程序,打印出mytest类对象mt1的name字段。

3、通过setattr,动态改变mt1对象的name字段值,代码如下:
class mytest():
def __init__(self,name):
self.name = name
mt1 = 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 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
mt1 = mytest('张三')
mp1 = myparpre(mt1)
mp1.before()
print ('-------')
mp1.after()

7、F5运行程序,可以看到在执行before函数前做了新操作,而after函数没有变化
