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('该模块文件中没有该名字')