反射
对象的反射
类的反射
模块的反射
本模块的反射:找到本模块sys.modules[__name__]
python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
hasattr() 函数用于判断对象是否包含对应的属性。getattr() 函数用于返回一个对象属性值。setattr 函数对应函数 getatt(),用于设置属性值,该属性必须存在。delattr 函数用于删除属性。delattr(x, 'foobar') 相等于 del x.foobar。
class Foo: f = '类的静态变量' def __init__(self,name,age): self.name=name self.age=age def say_hi(self): print('hi,%s'%self.name)obj=Foo('egon',73)#检测是否含有某属性print(hasattr(obj,'name')) #输出结果:Trueprint(hasattr(obj,'say_hi')) #输出结果:True#获取属性n=getattr(obj,'name')print(n) #输出结果:egonfunc=getattr(obj,'say_hi')func() #输出结果:hi,egon#设置属性setattr(obj,'sb',True)setattr(obj,'show_name',lambda self:self.name+'sb')print(obj.__dict__) #输出结果:{'name': 'egon', 'age': 73, 'sb': True, 'show_name':at 0x00000194A8817048>}print(obj.show_name(obj))#删除属性delattr(obj,'age')delattr(obj,'show_name')print(obj.__dict__) #输出结果:{'name': 'egon', 'sb': True}
hasattr(对象名,'属性名') 返回True或False属性值 = getattr(对象名,'属性名')方法的内存地址 = getattr(对象名,'方法名')方法的内存地址()
getattr 获取属性
class Management: role = '管理员' def __init__(self,name,sex,phone,mail): self.name = name self.sex = sex self.phone = phone self.mail = mail def creat_class(self): print('新建了一条讲师信息') def creat_teacher(self): print('新建了一条讲师信息') def creat_student(self): print('新建了一条讲师信息')Management.roleif hasattr(Management,'role') print(getattr(Management,'role')) # 管理员manager = Management('小雨','女',111252,'1111@qq.com')f = getattr(manager,'creat_class')# f() # 类外加括号f = getattr(manager,'sex')# 属性反射 # 使用字符串数据类型的变量名获取属性值print(f) # 类内不用加括号#># f() # 新建了一条讲师信息cs = getattr(manager,'creat_class') # 方法反射cs()
hasattr 检查是否含有某属性
# hasattr getattr 用getattr之前用hasattr,hasattr能检测是否含有某属性class Management: role = '管理员' def __init__(self,name,sex,phone,mail): self.name = name self.sex = sex self.phone = phone self.mail = mail def creat_class(self): print('新建了一条讲师信息') def creat_teacher(self): print('新建了一条讲师信息') def creat_student(self): print('新建了一条讲师信息')import loggingmanager = Management('小雨','女',111252,'1111@qq.com')if hasattr(manager,'sex1'): # True sex = getattr(manager,'sex1')# False print(sex)else: logging.warning('没有你输入的属性')
总结
class Foo: f = '类的静态变量' def __init__(self,name,age): self.name=name self.age=age def say_hi(self): print('hi,%s'%self.name)obj=Foo('egon',73)#检测是否含有某属性print(hasattr(obj,'name'))print(hasattr(obj,'say_hi'))#获取属性n=getattr(obj,'name')print(n)func=getattr(obj,'say_hi')func()print(getattr(obj,'aaaaaaaa','不存在啊')) #报错#设置属性setattr(obj,'sb',True)setattr(obj,'show_name',lambda self:self.name+'sb')print(obj.__dict__)print(obj.show_name(obj))#删除属性delattr(obj,'age')delattr(obj,'show_name')delattr(obj,'show_name111')#不存在,则报错print(obj.__dict__)