美文网首页
Python的类和实例绑定方法和属性

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

作者: 谭雒 | 来源:发表于2017-04-21 00:07 被阅读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,所以思维方式需要转换过来,希望通过这种方式让自己对自己的成长有帮助,同时也希望帮助到需要帮助的人。

    相关文章

      网友评论

          本文标题:Python的类和实例绑定方法和属性

          本文链接:https://www.haomeiwen.com/subject/yajrzttx.html