# 用字符串数据类型来访问这个变量的值就是反射
# 反射的方法有 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