面向对象基础(五)

# 用字符串数据类型来访问这个变量的值就是反射
# 反射的方法有 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
原文地址:https://www.cnblogs.com/tengx/p/11891846.html