反射(hasattr和getattr和setattr和delattr)

反射: 
反射指的是通过 “字符串” 对 对象的属性进行操作。

- hasattr: 通过 “字符串” 判断对象的属性或方法是否存在。

- getattr: 通过 “字符串” 获取对象的属性或方法。

- setattr: 通过 “字符串” 设置对象的属性或方法。

- delattr: 通过 “字符串” 删除对象的属性或方法。

# 注意: 反射的四个方法是python内置的。
class Foo:
    def __init__(self, x, y):
        self.x = x
        self.y = y


foo_obj = Foo(10, 20)
# hasattr
# 通过字符串x 判断对象中是否有 x属性
print(hasattr(foo_obj, 'x'))  # True
print(hasattr(foo_obj, 'y'))  # True
print(hasattr(foo_obj, 'z'))  # False

# getattr
res = getattr(foo_obj, 'x')
print(res)  # 10

# 若属性不存在,则返回默认值
res = getattr(foo_obj, 'z', '默认值')
print(res)  # 默认值

# setattr
# 为foo_obj设置一个属性z,值为30
setattr(foo_obj, 'z', 30)
print(hasattr(foo_obj, 'z'))  # True


# delattr
delattr(foo_obj, 'x')
print(hasattr(foo_obj, 'x'))  # False

 

# 反射应用:
class FileControl:

    def run(self):
        while True:
            # 让用户输入上传或下载功能的命令:
            user_input = input('请输入 上传(upload) 或 下载(download) 功能:').strip()

            # 通过用户输入的字符串判断方法是否存在,然后调用相应的方法
            if hasattr(self, user_input):
                func = getattr(self, user_input)
                func()
            else:
                print('输入有误!')

    def upload(self):
        print('文件正在上传...')

    def download(self):
        print('文件正在下载...')


file_control_obj = FileControl()
file_control_obj.run()

  

 

 
posted @ 2019-11-28 18:52  Parado  阅读(222)  评论(0编辑  收藏  举报