反射

反射

反射指的是通过 “字符串” 对对象的属性和方法进行操作,python内置的方法

1、hasattr

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

2、getattr

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

3、setattr

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

4、delattr

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

class Foo:
    x = 10
    y = 20
    def date(self):
        print('天王盖地虎,小鸡炖蘑菇')

obj = Foo()
# 判断对象属性或方法是否存在
print(hasattr(obj, 'x'))  # True
print(hasattr(obj, 'z'))  # False

# #获取对象方法或属性
print(getattr(obj, 'x'))  # 10
# # 可以设置默认值,值不存在时返回默认值,否则会报错
print(getattr(obj, 'z', '默认值'))  # 默认值
# # 获取对象的方法
res = getattr(obj, 'date')  
res()  # 天王盖地虎,小鸡炖蘑菇

# 设置对象方法或属性
# 此处设置的对象属性是在对象下面的,不是在类下面
setattr(obj, 'z', 30)
print(hasattr(obj,'z'))  # True
setattr(obj, 'x', 100)
print(getattr(obj, 'x'))  # 100

# 删除对象属性或方法,只能删除对象下的属性或方法,类里的没法删除,所有显示还是有x
delattr(obj, 'x')
print(hasattr(obj, 'x')) # True

反射应用

class File:
    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_obj = File()
file_obj.run()
posted @ 2019-11-28 21:35  Mr沈  阅读(114)  评论(0)    收藏  举报