什么是反射?
用字符串数据类型的变量名来访问这个变量的值
反射方法:一共四个
- getattr 获取指定字符串名称的对象属性
- hasattr 判断对象是否有对应的对象(字符串)
- setattr 为对象设置一个对象
- delattr 删除指定属性
反射主要用在哪里?
- 类
- 对象
- 模块
- 反射自己模块中的内容
为什么有反射这个概念?
已知有三个函数fun1, fun2, fun3这三个函数,如果我们想调用其中某个函数的时候,我们就只有在代码中写好,比如我写了一个这样的代码来实现这个功能:
s.py
def func1():
return "func1"
def func2():
return "func2"
def func3():
return "func3"
test.py
import s
call_str = input("input which function you want to call:")
if call_str == 'func1':
print(s.func1())
elif call_str == 'func2':
print(s.func2())
elif call_str == 'func3':
print(s.func3())
else:
print("404 NOT Found")
是想一下,如果s模块里有成千上百个函数供我们调用,那我们需要在test.py里写入成千上百个判断语句。这样太麻烦。
这时就引入了反射机制。
添加反射机制:
import s
call_str = input("input which function you want to call:")
"""
if call_str == 'func1':
print(s.func1())
elif call_str == 'func2':
print(s.func2())
elif call_str == 'func3':
print(s.func3())
else:
print("404 NOT Found")
"""
obj = getattr(s,call_str)
print(obj())
运行后我们输入 fun1, fun2, fun3都没有问题,但是当我们乱输入一个字符串的时候getattr内置函数就报如下的错误:
这个时候就可以使用hasattr这个内置函数了:
import s
call_str = input("input which function you want to call:")
"""
if call_str == 'func1':
print(s.func1())
elif call_str == 'func2':
print(s.func2())
elif call_str == 'func3':
print(s.func3())
else:
print("404 NOT Found")
"""
if hasattr(s,call_str): #判断在s中是否存在函数call_str
obj = getattr(s,call_str)
print(obj())
else:
print("404 NOT Found")
反射用在类:
class Student:
#ROLE是一个属性
ROLE = 'User1'
@classmethod
def check_course(self):
print("查看课程")
@staticmethod
def login():
print("登录")
#查看属性
print(Student.ROLE)
#反射查看属性,‘ROLE’,引号引着是一个字符串,也就是用字符串‘ROLE‘
#去反射Student类中的属性ROLE
print(getattr(Student,'ROLE'))
#反射调用方法
getattr(Student,'check_course')()
#反射调用静态方法
getattr(Student,'login')()
反射用在对象:
class A:
def __init__(self,name):
self.name = name
def func(self):
print("in func")
#实例化对象,并给name赋值
a = A('rain')
#查看name属性
print(getattr(a,'name'))
#对象调用方法
getattr(a,'func')()
反射用在模块:
import os
#rename('原名','要改成的名')
os.rename('__init__.py','init')
getattr(os,'rename')('init','__init__.py')