当前位置: 首页 > 后端技术 > Python

Fluentpython学习笔记-第10章

时间:2023-03-26 11:03:49 Python

第10章-序列修改、散列和切片反射反射主要是指程序访问、检测和修改自身状态或行为的能力。python中的一切都是对象(类、实例、模块等都是对象),那么我们就可以通过反射的形式来操作对象相关的属性。使用string数据类型的变量名或函数名来调用对应的属性A.bgetattr(A,'b')函数1.要实现可插拔机制,可以提前定义接口,接口实际上不会执行直到完成。这样就实现了即插即用,其实就是一种‘后期绑定’,什么意思?即可以先把主要逻辑写好(只定义接口),后面再实现接口的功能。例如:demo.pyclassFanShe(object):x=1deftest1(self):print('thisistest1')deftest(self):print("thisistest")其他文件调用:importdemoastfc=tf.FanShe#判断c对象中的test是否存在,存在则调用执行,不存在则执行其他逻辑代码ifhasattr(c,'test'):func=getattr(c,'test')print(func("hello"))else:print('这个方法不存在')print('处理其他逻辑')2.动态导入模块demo/__init__.pydemo/work.pywork.pydeftest():print('thisistest')在外层,如果要调用这个work.py中的test方法,可以使用如下方法:M=__import__('demo.work')print(M)M.work.test()#可以这样写importimportlibM=importlib.import_module('demo.work')print(M)M.test()PythonReflection中的Python反射方法主要有以下几个方法:1.hasattr(object,name)判断对象中是否有name字符串对应的方法或属性2.getattr(object,name,default=None)获取对象名称字符串属性的值,如果没有返回返回默认值3.setattr(object,key,value)设置对象的key属性为value值,相当于object.key=value4.delattr(object,name)删除对象的name字符串属性classCat(object):class_level='贵族'def__init__(self,name,type,speed,age):self.name=nameself.type=typeself.speed=speedself.age=agedefrun(self):print('%s老%s%s以%s的速度跑'%(self.age,self.type,self.name,self.speed))xiaohua=Cat('小花','波斯cat','10m/s',10)xiaohua.run()#小花,一只10岁的波斯猫,以10m/s的速度奔跑#hasattr(object,name)判断是否有方法or属性对应对象中的一个name字符串print(hasattr(xiaohua,'name'))#判断xiaohua是否有name属性,返回True,说明xiaohua有name属性,#注意'name'必须是astringtypeprint(hasattr(xiaohua,'size'))#返回False说明小花doesnothaveasizeattribute#2.getattr(object,name,default=None)获取objectname字符串属性的值,#如果不存在则返回默认值print(getattr(xiaohua,'speed','20m/s'))#10m/s#获取小花的速度属性,速度属性存在print(xiaohua.__dict__)#{'name':'小花','type':'波斯猫','speed':'10m/s','age':10}print(getattr(xiaohua,'体重','5kg'))#5kg,获取小花的体重属性,该属性不存在,返回default的值#print(getattr(xiaohua,'weight'))#不设置default时,该属性不存在#会报错AttributeError:'Cat'objecthasnoattribute'weight'#3.setattr(object,key,value)#设置对象的key属性为value#等价于object.key=valuesetattr(xiaohua,'weight','5kg')#给小花增加体重属性print(xiaohua.__dict__)#{'name':'小花','type':'波斯猫','speed':'10m/s','age':10,'weight':'5kg'}#4.delattr(object,name)删除对象的name字符串属性delattr(xiaohua,'weight')print(xiaohua.__dict__)#{'name':'小花','type':'波斯猫','speed':'10m/s','age':10}