zoukankan      html  css  js  c++  java
  • 反射

    一、什么是反射

    反射就是通过字符串来操作类或者对象的属性

    • 反射本质就是在使用内置函数,其中反射有以下四个内置函数:
      1. hasattr(object,name):判断一个属性是否在对象中,返回True或者False
      2. getattr(object, name, default=None):通过字符串获取属性或方法,如果获取到了,就会返回相应的属性或方法
      3. setattr(object, key, value):通过字符串来设置属性或方法
      4. delattr(object, name):通过字符串来删除属性或方法

    二、反射的应用

    假如有一个需求,需要根据用户输入的内容来调用类中的方法。可以怎么实现?

    class Base:
        pass
    class Foo(Base):
        def run(self):
            print('run')
        def speak(self):
            print('speak')
            
    cmd=input('请输入命令:')
    print(Foo.__dict__[cmd])
    p = Foo()
    Foo.__dict__[cmd](p)
    

    这样的确可以完成 不过太过麻烦

    2.1 使用反射

    class Base:
        pass
    class Foo(Base):
        def run(self):
            print('run')
        def speak(self):
            print('speak')
    
    cmd=input('请输入命令:')
    p = Foo()
    if hasattr(p,cmd):	# 查看对象中是否由这个属性
        run=getattr(p,cmd)	# 获取对象中的属性
        run()	# 执行
    else:
        print('该命令不存在')
    

    hasattr(object,name)

    判断一个属性是否在对象中,返回True或者False

    class Base:
        pass
    class Foo(Base):
        def run(self):
            print('run')
        def speak(self):
            print('speak')
    print(hasattr(Foo(),"speak"))
    

    getattr(object, name, default=None)

    通过字符串获取属性或方法,如果获取到了,就会返回相应的属性或方法

    class Base:
        pass
    class Foo(Base):
        def run(self):
            print('run')
        def speak(self):
            print('speak')
            
    run=getattr(Foo(),"run")
    run()	# 执行
    

    setattr(object, key, value)

    通过字符串来设置属性或方法

    class Base:
        pass
    class Foo(Base):
        def run(self):
            print('run')
        def speak(self):
            print('speak')
    
    p = Foo()
    key=input('请输入key:')
    value=input('输入value:')
    setattr(p,key,value)	# 设置属性
    age = getattr(p,key)
    print(age)
    
    def test(a):
        print(a)
    setattr(p,'test',test)	# 设置方法
    p.test(0)
    

    delattr(object, name)

    通过字符串来删除属性或方法

    class Base:
        pass
    class Foo(Base):
        def run(self):
            print('run')
        def speak(self):
            print('speak')
    
    p = Foo()
    p.name='xc'
    p.age=18
    p.sex='male'
    a=input('请输入要删除的属性:')
    print(p.__dict__)	
    delattr(p,a)	# 删除属性
    print(p.__dict__)
    

    小结

    反射:通过字符串来获取,设置,删除对象中的属性或方法

  • 相关阅读:
    SpringMVC的下载
    上传的前台实现
    SpringMVC自定义视图解析器的使用
    SpringMVC的Model对象的使用
    SpringMVC中使用作用域对象完成数据的流转
    SpringMVC的响应介绍
    SpringMVC的静态资源放行配置
    SpringMVC的静态资源放行
    SpringMVC的编码过滤器配置
    pymysql
  • 原文地址:https://www.cnblogs.com/XuChengNotes/p/11449011.html
Copyright © 2011-2022 走看看