python 面向对象之反射

python 面向对象之反射

反射这个术语在很多语言中都存在,并且存在大量的运用,什么是反射,反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力,在python中一切皆对象(类,实例,模块等等都是对象),那么我们就可以通过反射的形式操作对象相关的属性。

何为反射

简单的理解就是:利用字符串操作对象的属性的方法称之为反射。

理解这句话中的对象,在python中一切皆对象

  • py文件导入模块,就是模块对象,所以我们可以通过句点的方式模块名.名字访问模块中的名字,也可以理解成通过对象.属性的方式访问对象中的属性。
  • 列表数据类型中的每个列表都是列表对象,可以通过[11,22].append(33)的方式对列表对象进行操作,也符合对象.属性的用法。

而利用字符串来操作就是将字符串识别为对象中的属性,增删改查对象中的属性。

用户输入的数据,一般都是字符串,我们无法通过对象.字符串的方式来访问对象的属性。

但是用以下几个内置函数,就可以让字符串转化为可以被程序识别的属性了。

内置函数 功能
hasattr(obj,str数据) 重点 判断对象是否含有某个字符串对应的属性名或方法名
getattr(obj,str数据) 重点 根据字符串获取对象对应的属性名(值)或方法名(函数体代码)
setattr(obj,str数据1,str数据2) 根据字符串给对象设置或者修改数据
delattr(obj,str数据) 根据字符串删除对象里面的名字
判断用户输入内容是对象中的何种属性
class C1:
    school_name = 'xx学院'

    def choice_course(self):
        print('大宝贝们正在选课')

obj = C1()
while True:
    target_name = input('请输入您想要操作的名字>>>:')  # 用户输入了一个字符串
    if hasattr(obj, target_name):  # 判断字符串对应属性obj里有没有
        print('恭喜您 系统中有该名字')
        data_or_func = getattr(obj, target_name)  # 获取该名字对应的数据(值、函数)
        if callable(data_or_func):
            print('您本次使用的是系统中的某个方法')
            data_or_func()
        else:
            print('您本次使用的是系统中的某个数据')
            print(data_or_func)
    else:
        print('很抱歉 系统中没有该名字')
反射实战——简单模拟cmd窗口
class WinCmd:
    def __tasklist(self):  # tasklist命令,隐藏起来
        print('''
        1.学习
        2.学习
        3.还tm是学习
        ''')

    def __ipconfig(self):  # ipconfig命令
        print('''
        1.电脑
        2.笔记本
        3.laptop
        ''')

    def __get(self, file):  # 打开文件,需要传入一个文件名
        print(f'打开指定文件,{file}')

    def __put(self, file, addr):  # 上传文件,需要传入文件名和路径两个参数
        print(f'上传指定文件,{file}到{addr}')

    def server_run(self):
        while True:
            command = input('输入指令(quit退出):').strip()
            if command == 'quit':
                return
            command = f'_{self.__class__.__name__}__{command}'  # 隐藏之后只能这么拼了
            commands = command.split(' ')  # 依据空格切割
            if hasattr(self, commands[0]):  # 第一段是指令,判断是否拥有
                if len(commands) == 1:
                    getattr(self, command)()  # 自动把调用这个函数的对象,传入指令的参数
                elif len(commands) >= 2:  # 指令段数两段以上
                    getattr(self, commands[0])(*commands[1:])  # 后面的指令段是参数,传入括号
            else:
                print('没有这个指令')

obj = WinCmd()
obj.server_run()
posted @ 2022-11-07 19:09  leethon  阅读(72)  评论(0编辑  收藏  举报