面向对象之:反射

文章介绍:

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 来判断?使用反射后,两句代码就能搞定!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

欢迎大家加我微信,一起学习交流

 

 

posted @ 2019-05-23 15:57  小黄人Asa  阅读(510)  评论(0编辑  收藏  举报