Python基础之面向对象:6、面向对象之反射

面向对象之反射

一、反射

1、反射的定义

​ 主要是应用于类的对象上,在运行时,将对象中的属性和方法反射出来

2、使用的场景

​ 可以动态的向对象中添加属性和方法。也可以动态的调用对象中的方法或者属性。

3、常用方法

1.hasattr()

hasattr(obj, str)
'''
判断输入的str字符串在对象obj中是否存在(属性或方法),存在返回True,否则返回False	
'''

2.getattr()

getattr(obj, str)
'''
将按照输入的str字符串在对象obj中查找。
如找到同名属性,则返回该属性
如找到同名方法,则返回方法的引用
想要调用此方法得使用 getattr(obj,str)()进行调用。
如果未能找到同名的属性或者方法,则抛出异常:AttributeError。
'''

3.setattr()

setattr(obj,name,value)
'''
根据字符串,给对象设置/修改数据
'''

4.delattr()

delattr(obj, str)
'''
根据字符串,删除对象里的名字
'''

4、反射的实际应用

实际应用一:

​ 通过反射方法,模拟cmd命令窗口

class WinCmd:

    def tasklist(self):
        print("""
    1.学习编程
    2.学习python
    3.学习英语
    """)

    def ipconfig(self):
        print("""
        地址:127.0.0.1
        地址:上海浦东新区
        """)

    def get(self, target_file):
        print('获取指定文件', target_file)

    def put(self, target_file):
        print('上传指定文件', target_file)

    def server_run(self):
        print('欢迎进入简易版本cmd终端')
        while True:
            target_cmd = input('请输入您的指令>>>:')
            res = target_cmd.split(' ')
            if len(res) == 1:
                if hasattr(self, res[0]):
                    getattr(self, res[0])()
                else:
                    print(f'{res[0]}不是内部或者外部命令')
            elif len(res) == 2:
                if hasattr(self, res[0]):
                    getattr(self, res[0])(res[1])
                else:
                    print(f'{res[0]}不是内部或者外部命令')


obj = WinCmd()
obj.server_run()

实际应用二:

​ 通过反射方法,筛选数据

    	  # 利用反射保留某个py文件中所有的大写变量名及对应的数据值
        import settings
        print(dir(settings))  # dir列举对象可以使用的名字

        useful_dict = {}
        for name in dir(settings):
            if name.isupper():
                useful_dict[name] = getattr(settings, name)
        print(useful_dict)

        # while True:
        #     target_name = input('请输入某个名字')
        #     if hasattr(settings, target_name):
                 print(getattr(settings, target_name))
             else:
                 print('该模块文件中没有该名字')
posted @ 2022-11-07 18:54  kangshong  阅读(50)  评论(0编辑  收藏  举报