• 面向对象基础(五)


    # 用字符串数据类型来访问这个变量的值就是反射
    # 反射的方法有 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
  • 相关阅读:
    攻防世界pwn高手区——pwn1
    攻防世界misc——János-the-Ripper
    攻防世界逆向——game
    PWN——ret2dl_resolve
    谈一些想法
    python网络编程(一)
    pwnable.kr之unlink
    堆的数据结构探究
    记一次GKCTF之旅
    socket笔记
  • 原文地址:https://www.cnblogs.com/tengx/p/11891846.html
Copyright © 2020-2023  润新知