反射: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")()

 

posted @ 2021-02-21 20:42  跳动0101  阅读(70)  评论(0)    收藏  举报