zoukankan      html  css  js  c++  java
  • 初识python: 反射

    反射:通过字符串映射或修改程序运行时的状态、属性、方法

    反射有以下三个方法:

    hasattr(object, name)           判断一个对象(object)里是否有对应的字符串(name)的属性
    getattr(object, name)            根据字符串(name)去获取对象(object)里的,对应方法的内存地址(即,获取对应的方法)
    setattr(object, name,value)   给对象(object)添加属性(name)值(value)
    delattr(object,name)             删除对象的属性

    实例:

    def sleep(self):
        print('%s在睡觉' % self.name)
    
    def talk():
        print('说话')
    
    class People(object):
        sex = ''
        def __init__(self, name):
            self.name = name
    
        def eat(self):
            print('%s正在吃东西' % self.name)
    
    p = People('simple')
    
    print(hasattr(p, 'eat'))  # 返回True  # 判断p这个对象中是否有eat这个属性。
    print(hasattr(p, 'name'))  # 返回True
    f = getattr(p, 'eat')  # 获取eat的内存地址,即,获取eat方法
    print(f)  # 打印eat的内存地址
    print(f())  # 打印eat的返回值,即,执行eat方法
    
    
    # 变量操作
    str = input('变量:').strip()
    val = input('变量的值:').strip()
    if hasattr(p, str):  # 在p中是否存在str变量,str是用户传入的参数。如果存在,则执行以下操作。
        func = getattr(p, str)  # 获取p中str变量
        print('原来的变量:%s=%s'%(str,func))
        setattr(p,func,val)  # 修改p中str变量的值
        f = getattr(p,func)  # 重新获取p中str变量
        print('修改后的变量:%s=%s'%(str,val)) # 打印str的值
    else:  # 在p中不存在str变量,执行以下操作。
        setattr(p,str,val)  # 给p添加变量str,并赋值val --> str = val
        gv = getattr(p,str)  # 获取p中新添加的str变量
        print('新增了变量:%s=%s'%(str,gv))  # 打印新添加的str变量值
        delattr(p, str)  # 删除变量
        print('删除了变量:%s' % str)  # 删除p中str变量
        print('是否还存在变量%s:%s'%(str,hasattr(p,str)))  # 删除之后,再判断属性是否存在
    变量操作

    执行结果:

    def sleep(self):
        print('%s在睡觉' % self.name)
    
    def talk():
        print('说话')
    
    class People(object):
        sex = ''
        def __init__(self, name):
            self.name = name
    
        def eat(self):
            print('%s正在吃东西' % self.name)
    
    p = People('simple')
    
    print(hasattr(p, 'eat'))  # 返回True  # 判断p这个对象中是否有eat这个属性。
    print(hasattr(p, 'name'))  # 返回True
    f = getattr(p, 'eat')  # 获取eat的内存地址,即,获取eat方法
    print(f)  # 打印eat的内存地址
    print(f())  # 打印eat的返回值,即,执行eat方法
    
    # 方法操作
    str = input('方法:').strip()
    if hasattr(p, str):  # 在p中是否存在str方法,str是用户传入的参数。如果存在,则执行以下操作。
        func = getattr(p, str)  # 获取p中str方法
        print('方法%s执行结果:'%(str),end='')
        func()  # 执行方法
    else:  # 在p中不存在str方法,执行以下操作。
        # setattr(p,str,sleep)  # 给p添加了类方法sleep,带self参数
        setattr(p,str,talk)  # 给p添加方法talk,不带self参数
    
        # sleep = getattr(p,str)  # 获取p中新添加的str方法的内存地址
        talk = getattr(p,str)
    
        print('新增了方法:%s,返回结果:'%str)  # 打印新添加的str变量值
    
        # sleep(p)  # 类方法调用,带self
        talk() # 普通方法调用,不带self
    
        delattr(p, str)  # 删除方法
        print('删除了方法:%s' % str)  # 删除p中str变量
        print('是否还存在变量%s:%s'%(str,hasattr(p,str)))  # 删除之后,再判断属性是否存在
    方法操作

    执行结果:

  • 相关阅读:
    KETTLE封装
    基于MODBUS-RTU协议的串口编程
    阿里DRUID 配置说明及分析
    CopyOnWriteArrayList集合排序异常问题
    CopyOnWriteArrayList集合线程安全解释
    JAR包数字签名与验证
    MySQL中select * for update锁表的范围
    Kettle文本文件输出和输入控件使用中,换行符导致的问题处理
    UAP如何根据DeviceFamily显示不同的页面
    Windows 10 响应式设计和设备友好的开发
  • 原文地址:https://www.cnblogs.com/simple-li/p/11423116.html
Copyright © 2011-2022 走看看