最近经常接触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
网友评论