delattr
def bulk(self): # 装到类里必须要有self print('%s in the bulking...' % self.name) class Dog(object): def __init__(self, name): self.name = name def eat(self, food): print('%s is eating...' % self.name, food) d = Dog('张三') choice = input('请输入>>:').strip() if hasattr(d, choice): delattr(d, choice) # 删除属性, else: # 输入的类里面的方法里没有 setattr(d, choice, bulk) # 等价于d.choice=bulk,动态加了个方法 d.talk(d) # 执行输入的,相当于执行了bulk,要把类对象传给,必须是d.输入的内容 print(d.name)
输入name
输入name,最后打印报错,因为属性name已经被删除了
反射应用的例子
import sys 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('check_course') def choose_course(self): print('choose_course') def choosed_course(self): print('查看已选择的课程') def login(): username = input('请输入user : ') password = input('请输入pwd : ') with open('user_info') as f: for line in f: user, pwd, ident = line.strip().split('|') # ident = 'Manager' if user == username and pwd == password: print('登录成功') return username, ident def main(): usr, id = login() print('user,id :', usr, id) file = sys.modules['__main__'] # 获取到该文件的内存对象 cls = getattr(file, id) # Manager = getattr(当前文件,'Manager') # cls ==< class '__main__.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()
当输入 zou 和123456 时
请输入user : zou 请输入pwd : 123456 登录成功 user,id : zou Manager 1 创造学生账号 2 创建课程 3 查看学生信息 num >>>2 创建课程 1 创造学生账号 2 创建课程 3 查看学生信息 num >>>3 查看学生信息 1 创造学生账号 2 创建课程 3 查看学生信息 num >>>
当输入 test 666时
请输入user : test 请输入pwd : 666 登录成功 user,id : test Student 1 查看所有课程 2 选择课程 3 查看已选择的课程 num >>>1 check_course 1 查看所有课程 2 选择课程 3 查看已选择的课程 num >>>2 choose_course 1 查看所有课程 2 选择课程 3 查看已选择的课程 num >>>3 查看已选择的课程 1 查看所有课程 2 选择课程 3 查看已选择的课程