面向对象进阶
反射
反射:通过字符串的形式操作对象相关的属性
getattr() 使用字符串数据类型的变量名获取属性值
hasattr() 使用字符串数据类型的变量名判断属性是否存在
setattr() 使用字符串数据类型的变量名获修改属性值
delattr() 使用字符串数据类型的变量名获删除属性值
class Management: role = '管理员' def __init__(self,name,sex,phone,mail): self.name = name self.sex = sex self.phone = phone self.mail = mail def create_class(self): print('创建了一个班级') def create_teacher(self): print('新建了一条讲师信息') def create_student(self): print('新建了一条学生信息') manager = Management('小雨','女',1233211234567,'xiaoyu@qq.com') # func = input('func:') # f = getattr(manager,func) # f() f = getattr(manager,'phone') # 使用字符串数据类型的变量名获取属性值 print(f) f = getattr(manager,'phone1','没有这个属性') # 可以添加找不到的时候的默认值,不然会报错 print(f) cs = getattr(manager,'create_class') # 使用字符串数据类型的方法名调用方法 cs() print(hasattr(manager,'name')) # True f = getattr(Management,'role') print(f) import logging if hasattr(manager,'sex'): sex = getattr(manager,'sex') print(sex) else: logging.warning('没有您输入的属性') # Management.Country = 'China' setattr(Management,'Country','China') print(Management.Country) # China delattr(Management,'Country') setattr(manager,'job','teacher') print(manager.job) delattr(manager,'job') # 可以通过delattr删除一个类中的方法 delattr(Management,'create_class') def create_course(self): print('创建了一个课程') setattr(manager,'create_course',create_course) manager.create_course(manager)
对象的反射
类的反射
模块的反射
本模块的反射:找到本模块sys.modules[__name__]
aaa = 'bbb' import sys print(sys.modules['__main__']) print(getattr(sys.modules['__main__'],'aaa')) # bbb print(sys.modules[__name__]) print(getattr(sys.modules[__name__],'aaa'))