python 面向对象之反射
python 面向对象之反射
反射这个术语在很多语言中都存在,并且存在大量的运用,什么是反射,反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力,在python中一切皆对象(类,实例,模块等等都是对象),那么我们就可以通过反射的形式操作对象相关的属性。
何为反射
简单的理解就是:利用字符串操作对象的属性的方法称之为反射。
理解这句话中的对象,在python中一切皆对象。
- py文件导入模块,就是模块对象,所以我们可以通过句点的方式
模块名.名字
访问模块中的名字,也可以理解成通过对象.属性
的方式访问对象中的属性。 - 列表数据类型中的每个列表都是列表对象,可以通过
[11,22].append(33)
的方式对列表对象进行操作,也符合对象.属性
的用法。
而利用字符串来操作就是将字符串识别为对象中的属性,增删改查对象中的属性。
用户输入的数据,一般都是字符串,我们无法通过对象.字符串
的方式来访问对象的属性。
但是用以下几个内置函数,就可以让字符串转化为可以被程序识别的属性了。
内置函数 | 功能 |
---|---|
hasattr(obj,str数据) 重点 | 判断对象是否含有某个字符串对应的属性名或方法名 |
getattr(obj,str数据) 重点 | 根据字符串获取对象对应的属性名(值)或方法名(函数体代码) |
setattr(obj,str数据1,str数据2) | 根据字符串给对象设置或者修改数据 |
delattr(obj,str数据) | 根据字符串删除对象里面的名字 |
判断用户输入内容是对象中的何种属性
class C1:
school_name = 'xx学院'
def choice_course(self):
print('大宝贝们正在选课')
obj = C1()
while True:
target_name = input('请输入您想要操作的名字>>>:') # 用户输入了一个字符串
if hasattr(obj, target_name): # 判断字符串对应属性obj里有没有
print('恭喜您 系统中有该名字')
data_or_func = getattr(obj, target_name) # 获取该名字对应的数据(值、函数)
if callable(data_or_func):
print('您本次使用的是系统中的某个方法')
data_or_func()
else:
print('您本次使用的是系统中的某个数据')
print(data_or_func)
else:
print('很抱歉 系统中没有该名字')
反射实战——简单模拟cmd窗口
class WinCmd:
def __tasklist(self): # tasklist命令,隐藏起来
print('''
1.学习
2.学习
3.还tm是学习
''')
def __ipconfig(self): # ipconfig命令
print('''
1.电脑
2.笔记本
3.laptop
''')
def __get(self, file): # 打开文件,需要传入一个文件名
print(f'打开指定文件,{file}')
def __put(self, file, addr): # 上传文件,需要传入文件名和路径两个参数
print(f'上传指定文件,{file}到{addr}')
def server_run(self):
while True:
command = input('输入指令(quit退出):').strip()
if command == 'quit':
return
command = f'_{self.__class__.__name__}__{command}' # 隐藏之后只能这么拼了
commands = command.split(' ') # 依据空格切割
if hasattr(self, commands[0]): # 第一段是指令,判断是否拥有
if len(commands) == 1:
getattr(self, command)() # 自动把调用这个函数的对象,传入指令的参数
elif len(commands) >= 2: # 指令段数两段以上
getattr(self, commands[0])(*commands[1:]) # 后面的指令段是参数,传入括号
else:
print('没有这个指令')
obj = WinCmd()
obj.server_run()