反射:python反射 getattr hasattr setattr delattr
反射:什么是反射
用字符串数据类型的变量名来访问这个变量的值
反射的方法: getattr hasattr setattr delattr
class Student: Role = 'STUDENT' @classmethod def check_course(cls): print('查看课程了') @staticmethod def login(): print('登录课程了') # 反射查看属性 print(Student.Role) print(getattr(Student, 'Role')) # 用字符串数据类型的变量名来访问这个变量的值 # 反射调用方法 Student.check_course() Student.login() getattr(Student, 'check_course')() # 反射调用方法 stu = input(">>>") if hasattr(Student, stu): getattr(Student, stu)() stu = input(">>>") print(hasattr(Student, stu)) # 返回True或False if hasattr(Student, stu): getattr(Student, stu)()
二、拓展
os.rename('../test','../test.txt') getattr(os, 'rename')('../test','../test.txt')
def qqxing(): print('qqxing') def wahaha(): print('wahaha') import sys my_file = sys.modules['__main__'] my_file.qqxing() getattr(my_file,'qqxing')()
class Manager: OPERATE_DIC = [ ('创造学生账号', 'create_student'), ('创建课程','create_course'), ('查看学生信息','check_student_info'), ] def __init__(self,name): self.name = name def create_student(self): print('创建学生账号') def create_course(self): print('创建课程') def check_student_info(self): print('查看学生信息') class Student: OPERATE_DIC = [ ('查看所有课程', 'check_course'), ('选择课程', 'choose_course'), ('查看已选择的课程', 'choosed_course') ] def __init__(self,name): self.name = name def check_course(self): print('查看所有课程') def choose_course(self): print('选择课程') def choosed_course(self): print('查看已选择的课程') def login(): username = input('user : ') password = input('pwd : ') with open('userinfo') as f: for line in f: user, pwd, ident = line.strip().split('|') # ident = 'Manager' if user == username and pwd == password: print('登录成功') return username, ident import sys def main(): usr, id = login() print('user,id :', usr, id) file = sys.modules['__main__'] cls = getattr(file, id) #Manager = getattr(当前文件,'Manager') obj = cls(usr) operate_dic = cls.OPERATE_DIC while True: for num, i in enumerate(operate_dic, 1): print(num, i[0]) choice = int(input('num >>>')) choice_item = operate_dic[choice-1] getattr(obj, choice_item[1])() main()
# 反射
# hasattr,getattr
# 类名.名字
# getattr(类名,'名字')
# 对象名.名字
# getattr(对象,'名字')
# 模块名.名字
# import 模块
# getattr(模块,'名字')
# 自己文件.名字
# import sys
# getattr(sys.modules['__main__'],'名字')
class A: def __init__(self,name): self.name = name a = A('alex') # a.name = 'alex_SB' # getattr(a,'name') setattr(a,'name','alex_SB') print(a.name) print(a.__dict__) del a.name print(a.__dict__) delattr(a,'name') print(a.__dict__)
三 、反射本模块的方法
import sys my_module = sys.modules[__name__] getattr(my_module, "login")()

浙公网安备 33010602011771号