Python高级
Python高级-面向对象的反射(自省)
Python高级-面向对象的反射(自省)
什么是反射(自省)?
反射的概念是由Smith在1982年提出的,主要是指程序可以访问,检测和修改他本身状态或行为的一种能力(自省)
hasattr(object,name):判断object里有没有一个name字符串(‘属性名’)对应的方法或属性
getattr(object,name):获取属性值
setattr(object,name):修改或者新增属性及值
delattr(object,name):删除属性
class Student(object): country = 'china' def __init__(self,name,age): self.name = name self.age = age def get_name(self): print('正在调用get_name方法。。。') return self.name def get_age(self): return self.age s = Student('bayi',33) # hasattr(object,name):判断object里有没有一个name字符串(‘属性名’)对应的方法或属性 print(hasattr(s,'name')) # True print(hasattr(s,'get_name')) # True print(hasattr(s,'get_con')) # False # getattr(object,name):获取属性值 print(getattr(s,'name')) # bayi print(getattr(s,'get_name')) # <bound method Student.get_name of <__main__.Student object at 0x000001426082D668>> # 获取方法信息返回的是方法名,想要运行方法,如何操作呢 n = getattr(s,'get_name') print(n()) # bayi # setattr(object,name,newname):新增属性及值,修改属性及值 setattr(s,'name','feng') # 修改属性及值 print(s.name) # feng setattr(s,'aihao','famele') print(getattr(s,'aihao')) # famele # delattr(object,name):删除属性 print(getattr(s,'age')) # 33 delattr(s,'age') if hasattr(s,'age'): print(getattr(s,'age')) else: print('age属性不存在') # 结果:age属性不存在 ''' Python一切皆对象,文件也是对象,所有文件也可以反射 需求:检测一下time这个当前模块有没有某些属性 需求:检测当前模块有没有某些属性 ''' import time # 需求:检测一下time这个当前模块有没有某些属性 print(hasattr(time,'ctime')) # True f = getattr(time,'ctime') print(f()) # Thu Apr 16 10:47:49 2020 # 需求:检测当前模块有没有某些属性 import sys # 获取当前模块对象 # print(sys.modules) cur_obj = sys.modules[__name__] # 获取当前模块的对象 print(hasattr(cur_obj,'a')) # False a = 22 print(hasattr(cur_obj,'a')) # True
最后修改:2020年4月17日 21:08