动态语言与静态语言有很多不同,最大的特性之一就是可以实现动态的对类和实例进行修改,在Python中,我们创建了一个类后可以对实例和类绑定心的方法或者属性,实现动态绑定。
例如:
#创建一个Test类
>>> class Test:
... pass
在动态绑定中分为两种绑定方式,一种是实例绑定,另一种是类绑定。
首先我们来看实例绑定:
#新建一个Test实例
>>> a=Test()
#绑定属性,这是最简单的绑定方式
>>> a.y=4
#输出
>>> print(a.y)
4
#给实例绑定方法
#定义一个方法
>>> def set(x):
... self.x=x
#绑定方法到实例
>>> a.set=set
#调用该方法,这是第一种方式,只能当前实例使用
>>> a.set(a,1)
#其中第一个参数是自身的引用,这种方式的原理是在实例中新建一个属性变量,将函数赋值作为变量赋值给该属性,但是第一参数必须是自身引用,原因是什么还没具体研究,等待以后了解
>>> print(a.x)
1
#还有另外一种方式,通过types中的MethodType方法绑定方法到实例:
>>> from types import MethodType
#第一个参数是方法的引用,第二个是自身的引用
>>> a.set=MethodType(set,a)
>>> a.set(4)
>>>print(a.x)
4
以上是第一种动态绑定的方式,这种绑定方式只能够当前实例使用,还有一种绑定是对类进行绑定,这种方式实例后的的对象都能够使用:
#上面我们创建类Test 和
方法set
#绑定类属性
>>> Test.y=4
>>> a=Test()
>>> b=Test()
>>>print( a.y, b.y)
#这种方式两个实例都拥有相同的属性值,输出结果
( 4, 4)
#绑定方法我发现有两种方式
#第一种
#这种方式原理同上面实例绑定方法一样,相当于给类新建了一个属性,然后将方法作为值赋值给该属性变量
>>> Test.set=set
>>> a=Test()
>>> b=Test()
>>> a.set(1)
>>> b.set(4)
>>> print( a,x , b.y)
(1 ,4)
#另一种就是通过MethodType方法绑定,这种方式应该是在内存中新建了一个引用,所有实例化后的对象都共享该方法,所以只会保留一个值,如同Java中的静态变量
#第二个参数是类本身
>>> Test.set=Method(set,Test)
>>> a=Test( )
>>> b=Test( )
>>> a.set(1)
>>> b.set(4)
>>> print(a,x, b.x)
(4 ,4)
#因为所有实例享用的是同一个引用的方法,所以整个内存只存在一个。因为b.set(4)比a.set(1)后调用,所以后面的会覆盖掉前面的,所以所有实例该方法的值都是4