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