面向对象基础(五)
# 用字符串数据类型来访问这个变量的值就是反射 # 反射的方法有 getattr hasattr setattr delattr # 用一个小案例来演示反射 # 文本信息 # xiaT|123456|Manager # haichao|666|Student # wenda|2222|Teacher class Student: OPERATE_DIC = [ (1, 'check_course'), (2, 'choose_course'), (3, 'choosed_course') ] def __init__(self,name): self.name = name def check_course(self): print('查看课程') def choose_course(self): print('选择课程') def choosed_course(self): print('查看已选课程') class Manager: OPERATE_DIC = [ (1, 'create_student'), (2, 'create_course'), (3, '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('查看课程信息') # 登录验证 def login(): username = input('user>>') password = input('pwd>>') with open('userinfo',mode='r') as f: for line in f: user,pwd,ident = line.strip().split('|') # 如果这里登陆成功将用户名和职业返回 if username == user and password == pwd: print('登陆成功') return user,ident # 反射函数 import sys def reflex(): # 这里拿到用户名和职业 user,ident = login() # 获取到我们当前文件的命名空间 my_file = sys.modules['__main__'] # 获取到类实例化一个对象,这里应用到反射我们这个ident是字符串,但是我们需要的是变量的值 obj = getattr(my_file,ident)(user) # 获取到静态字段中的数据 operate_dic = obj.OPERATE_DIC # 打印选择列表 for i in operate_dic: print(i[0],i[1]) choice = int(input('num>>>')) # 通过反射来动态执行用户选择的程序 getattr(obj,operate_dic[choice - 1][1])() reflex()
# 关于type和siinstance的区别 class mystr(str): pass str1 = mystr('Tian') print(isinstance(str1,str)) print(type(str1) is str) # result: True False 此处mystr继承了str,因为mystr没有构造函数所以当实例化的时候调用了str的构造函数 # str1的类是mystr, # type只能查看父类不能查找继承类,而isinstance可以查找类链上的所有类 class A: pass class B(A): pass print(issubclass(B,A)) # 判断B的父类是否是A