反射
反射
反射指的是通过 “字符串” 对对象的属性和方法进行操作,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()