美文网首页
Python的动态性

Python的动态性

作者: Rokkia | 来源:发表于2016-10-10 11:29 被阅读622次

    最近经常接触python中动态一词,python的动态性可以说是python的一大特点,但是总给我一种太过灵活驾驭不了的感觉,所以想做一下总结。

    1.类中属性的动态绑定

    初见动态性的强大

    class newClass(object):
        def __init__(self):
            pass
    #给classA动态绑定一个num
    classA = newClass()
    classA.num = 10
    #输出classA的num属性
    print classA.num
    10
    

    第一次看第一反应是,不应该是报错嘛 ?classA.num哪里来的?还能使用?自己试过几次发现:真没报错。classA真的就多了这么一个属性。还这能使用,而且classA不灭,num就存在

    好奇,classA有num,如果我创建个classB呢

    classB = newClass()
    classB.num
    
    AttributeError: 'classD' object has no attribute 'num2'
    

    果然这是classA专属
    除了属性还有方法,是否可以动态绑定方法呢

    2.类中方法的动态绑定
    #首先来创建一个方法
    def set_age(self,age):   #不要忘了方法要给self哦
        self.age = age
    #还是classA
    classA.set_age = set_age
    #没问题,貌似可以
    classA.set_age(18)
    #boom  报错,说少给一个参数,没少给啊,难道self也是一个参数?
    TypeError: set_age() takes exactly 2 arguments (1 given)
    classA.set_age(18,18)
    #boom 报错,说int没有age这个属性
    AttributeError: 'int' object has no attribute 'age'
    

    根据问题分析self在set_age里确实是一个参数,而且需要填入,这跟平时使用的方法完全不同,也就是说classA并没有绑定方法,更像是绑定了一个函数
    是否不能绑定了,是可以的,可以这样做

    from types import MethodType
    #通过MethodType来绑定方法
    classA.set_age = MethodType(set_age,classA)
    #试验一下
    classA.set_age(20)
    classA.age
    #确定已经成为20了
    20
    

    看样子可以了,让我们试验下被我们遗忘的classB

    classB.set_age(20)
    #boom 报错  没有这个set_age属性 ?
    AttributeError: 'classD' object has no attribute 'set_age'
    

    看来只是给classA这个实例赋值了
    要是想所有的实例都有怎么办呢

    #直接将这个方法赋值给newClass这个类
    newClass.set_age = set_age
    #当你动态绑定完成之后,你可以直接使用,不用再重新声明classB
    classB.set_age(21)
    classB.age
    21
    

    成功了!
    通过上面这种方法绑定,你会发现,在动态绑定方法同时,还设置了属性,实在有点强大。
    但是这种方式貌似只适用于绑定私有属性和普通属性,如果想要设定类属性可以直接给类动态绑定。

    #绑定类属性
    newClass.biggestAge = 0
    

    本文只是对自己平时学习的总结,如有不对的地方,还望各位指出,一起交流学习

    相关文章

      网友评论

          本文标题:Python的动态性

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