文章介绍:
1.什么是反射?
2.反射怎么用?
3.什么情况下使用反射?
一.什么是反射?
1.反射定义:
反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动!
2.反射的作用:
动态获得类的信息.
让对象告诉我们相关信息(对象拥有属性,方法,已经对象所属的类等)
3.反射:
Reflection
二.反射怎么用?
1.通过字符串的形式操作对象的相关属性
四个可以自省的函数:
hasattr(对象名,属性名)
getattr(对象名,属性名)
setattr(对象名,属性名,值)
delattr(对象名,属性名)
class Test:
name = "小黄人Asa"
def __init__(self, age):
self.age = age
def sleep(self):
print("你都%d,还在睡懒觉" % self.age)
"""hasattr(对象名,属性名) 检查是否含有某个属性,如果有,返回True,否则返回Flase"""
test=Test(28)
print(hasattr(test, "name")) # True
print(hasattr(Test, "sleep")) # True
print(hasattr(Test, "eat")) # False
"""getattr(对象名,属性名) 获取某个属性"""
test2=Test(30)
print(getattr(test2,"name"))#小黄人Asa
print(getattr(test2,"heigth")) #如果找不到属性,则会报错: 'Test' object has no attribute 'height'
"""setattr(对象名,属性名,值) 设置某个属性"""
test3=Test(35)
setattr(test3,"weight",60)
print(test3.__dict__)#{'age': 35, 'weight': 60}
"""delattr(对象名,属性名) 删除某个属性"""
test4=Test(40)
delattr(test4,"age")
print(test4.__dict__)
2.怎么利用反射去执行类或对象中的方法呢?
先实例化:test5=Test(45)
我们先看看print(getatter(test5,"Sleep"))打印出来的结果:<function Test.sleep at 0x000001FF98C7B048>
是不是很像某个方法里的内存地址?如果要执行这个方法,是不是在后面加个'()'就可以了?
getatter(test5,"Sleep")() 结果是:"你都45了,还在睡懒觉"
3.其他语言中的反射:
C#:组成: ‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成
可以利用反射,可以在软件运行时,获得这几个组成部分的相关信息.
三.什么情况下使用反射?
我们浏览网页,都是从一个链接跳到另一个链接,那么,我现在有个需求:
1.输入"baidu",进入百度网页
2.输入"QQ",进入QQ网页
不使用反射:
class WebPage:
def baidu(self):
print("www.baidu.com")
def qq(self):
print("www.QQ.com")
web = WebPage()
while 1:
content = input("请输入:")
if content.lower() == "qq":
web.qq()
elif content.lower() == "baidu":
web.baidu()
else:
print("输入有误!")
使用反射:
class WebPage: def baidu(self): print("www.baidu.com") def qq(self): print("www.QQ.com") web = WebPage() while 1: content = input("请输入:").lower() if hasattr(web,content): getattr(web,content)() else: print("输入有误!")
总结:上面两段代码我们对比下,如果不使用反射,我要反问很多网站,是不是要写很多的elif 来判断?使用反射后,两句代码就能搞定!
欢迎大家加我微信,一起学习交流