093 反射

一、什么是反射

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

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

二、如何使用反射

  • 反射本质就是在使用内置函数,其中反射有以下四个内置函数:
  1. hasattr:判断一个方法是否存在与这个类中
  2. getattr:根据字符串去获取obj对象里的对应的方法的内存地址,加"()"括号即可执行
  3. setattr:通过setattr将外部的一个函数绑定到实例中
  4. delattr:删除一个实例或者类中的方法
class Foo:
    def __init__(self,name,pwd):
        self.name = name
        self.pwd = pwd

    def run(self):
        print('run')
    def speak(self):
        print('speak')

p=Foo('xichen',18)
  • hasattr:判断一个方法是否存在与这个类中

    print(hasattr(p,'name'))

    True

  • getattr:根据字符串去获取obj对象里的对应的方法的内存地址,加"()"括号即可执行

    if hasattr(p,cmd):
        run=getattr(p,cmd)
        run()
    else:
        print('该命令不存在')

    请输入命令:run

    run

  • setattr:通过setattr将外部的一个函数绑定到实例中

    1.通过用户输入将外部的属性添加到当前的实例中
    print(p.__dict__)
    key=input('请输入key:')
    value=input('输入value:')
    setattr(p,key,value)
    print(p.__dict__)

    {'name': 'xichen', 'pwd': 18}
    请输入key:age
    输入value:18
    {'name': 'xichen', 'pwd': 18, 'age': '18'}

    2.动态的将外部的方法添加到当前的实例中
    def test(a):
        print(a)
    
    print(p.__dict__)
    setattr(p,'test',test)
    print(p.__dict__)
    
    p.test(0)

    {'name': 'xichen', 'pwd': 18}
    {'name': 'xichen', 'pwd': 18, 'test': <function test at 0x000001D1E98069D8>}
    0

  • delattr:删除一个实例或者类中的方法

    扫描二维码关注公众号,回复: 7158519 查看本文章
    1.最原始的删除对象的属性方法
    print(p.__dict__)
    del p.name
    print(p.__dict__)

    {'name': 'xichen', 'pwd': 18}
    {'pwd': 18}

    2.动态删除p中属性为变量a的属性
    a=input('请输入要删除的属性:')
    print(p.__dict__)
    delattr(p,a)
    print(p.__dict__)

    请输入要删除的属性:pwd # 删除对象中属性为pwd字符串的属性
    {'name': 'xichen', 'pwd': 18}
    {'name': 'xichen'}

三、使用反射的例子

  1. 判断一下对象中有没有没有我输入的属性,如果有,打印

    cmd=input('请输入要查询的属性:')
    if hasattr(p,cmd):
        a=getattr(p,cmd)
        print(a)
    else:
        print('该属性不存在')

    请输入要查询的属性:name
    xichen

猜你喜欢

转载自www.cnblogs.com/xichenHome/p/11448714.html