面向对象核心编程之反射现象1
八股文如下:
1.什么是反射?
2.反射怎么用?
3.什么情况下使用反射?
一.什么是反射?
1.反射定义:
反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动!
2.反射的作用:
动态获得类的信息.
让对象告诉我们相关信息(对象拥有属性,方法,已经对象所属的类等)
3.反射:
Reflection
三.什么情况下使用反射?
我们浏览网页,都是从一个链接跳到另一个链接,那么,我现在有个需求:
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 来判断?使用反射后,两句代码就能搞定!
问题1:什么是反射?
答:是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)
----简单的来说,反射就是指可以通过字符串的形式来操作对象的属性
问题2:反射有啥用?
答:其中一个应用场景就是人机交互页面,用户在键盘输入的一般都是字符串形式,传入界面当中,程序去寻找关于字符串的方法,从而去调用该方法!!
直接看代码吧!还是比较easy的!
反射、自省有四个方法:
1、 getattr() 获取
2、 hasattr() 判断
3、 setattr() 赋值
4、 delattr() 删除
实现通过字符串的形式,对对象里面的各种属性进行任意的操作!!
'''
问题1:什么是反射?
答:是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)
----简单的来说,反射就是指可以通过字符串的形式来操作对象的属性
问题2:反射有啥用?
答:其中一个应用场景就是人机交互页面,用户在键盘输入的一般都是字符串形式,传入界面当中,程序去寻找关于字符串的方法,从而去调用该方法!!
'''
'''
反射、自省有四个方法:
1、 getattr() 获取
2、 hasattr() 判断
3、 setattr() 赋值
4、 delattr() 删除
实现通过字符串的形式,对对象里面的各种属性进行任意的操作!!
'''
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
def walk(self):
print('%s赶紧走!!'%self.name)
def show(self):
print('%s在展示自己的风采!!'%self.name)
def show1(self):
print('%s在展示自己的风采!!'%self.name)
p1=Person('小李',11)
#字符串获取对象中的实例属性
a=getattr(p1,'name')
print(a)
#字符串判断对象中是否存在其方法或者实例属性
if hasattr(p1,'age'):
print('对象p1中存在age')
if hasattr(p1,'run'):
print('p1对象中存在实例属性run')
if hasattr(p1,'walk'):
p1.walk()
if hasattr(p1,'run'):
p1.run()
#赋值,多加属性,或者方法
setattr(p1,'sex','man')
print(p1.sex)
setattr(Person,'show',show)
p1.show()
setattr(p1,'show1',show1)
p1.show1(p1)
#删除属性,或者方法
#delattr(p1,'show')
delattr(p1,'age')
p1.age