Python的类和实例绑定方法和属性

2017-04-21  本文已影响0人  谭雒
动态语言与静态语言有很多不同,最大的特性之一就是可以实现动态的对类和实例进行修改,在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
用MethodType将set方法绑定到Test类,并不是将这个方法直接写到Test类内部,而是在Test内存中创建一个link指向外部的方法,在创建Test实例的时候这个link也会被复制。所以不管创建多少实例,这些实例和Stu类都指向同一个set方法。a.set(1)并没有在a这个实例内部创建x属性,而是将x属性创建在外部set方法的内存区中。
刚开始写博客,不足之处请指教。Python的学习也是最近才开始,以前使用最多的是Java,所以思维方式需要转换过来,希望通过这种方式让自己对自己的成长有帮助,同时也希望帮助到需要帮助的人。
上一篇下一篇

猜你喜欢

热点阅读