zoukankan      html  css  js  c++  java
  • 面向对象之:反射

    文章介绍:

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

     

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

     

     

  • 相关阅读:
    php基本语法与安装
    面向对象编程 es5和es6的构造函数
    利用正则搜索替换
    正则特殊符号
    正则边界符 限定符
    面试官给我挖坑:rm删除文件之后,空间就被释放了吗?
    为什么 IPv6 难以取代 IPv4
    Docker系列教程04-Docker构建镜像的三种方式
    Docker系列教程03-Docker私有仓库搭建(registry)
    Linux-I/O模型详解
  • 原文地址:https://www.cnblogs.com/sl372/p/10912424.html
Copyright © 2011-2022 走看看