zoukankan      html  css  js  c++  java
  • 反射

    一、什么是反射

    Python反射机制指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法;对于给定的一个对象,都能够调用它的任意一个属性和方法。这种动态获取类的内容以及动态调用对象的方法称为反射机制。

    Python的反射机制允许编程人员在对类未知的情况下,获取类相关信息的方式变得更加多样灵活,调用类中相应方法,是Python增加其灵活性与动态性的一种机制。

    二、反射的具体实现

    python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。

    class Person:
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def speak(self):
            print("I am %,%d years old."%(self.name,self.age))
    
    p = Person("lilong",20)
    
    
    # 在进行操作之后使用__dict__方法查看
    # #### 查看类的字典 ####
    # print(Person.__dict__)
    
    # #### 检查是否含有成员 ####  
    # print(hasattr(p, "name"))
    # print(hasattr(p, "age"))
    # print(hasattr(p, "speak"))
    
    # #### 获取成员 ####  没有报错,第3个参数为自定义语句(错误提示)
    # print(getattr(p, "name"))
    # print(getattr(p, "age"))
    # print(getattr(p,"speak"))
    
    # #### 设置成员 ####
    # setattr(p, "sex", "falme")
    # setattr(p, "show", lambda num: num + 1)
    
    # #### 删除成员 ####
    # delattr(p, "name")
    # delattr(p, "age")
    # delattr(p, "speak")
    
    # 结论:
    # 实际进行的就是通过操作类的字典进行增删改除

    三、自定义(覆盖原有的机制)

    class Person:
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def speak(self):
            print("I am %,%d years old."%(self.name,self.age))
    
        def __getattr__(self, item):
            print("属性不存在")
    
        def __setattr__(self, key, value):  #添加或修改时触发 例如赋值 self.name = name
            # self.key = value  #无限循环
            self.__dict__[key] = value
    
        def __delattr__(self, item):    #删除时触发
            #del self.item  #无限循环
            self.__dict__.pop(item)
    
    p = Person("lilong",20)
    
    # print(getattr(p, "sex"))    #返回(属性不存在,None),不会报错
    
    # 修改
    # p.age = 18
    # print(p.__dict__)
    
    # 增加
    # p.__dict__["sex"] = "famle"
    # print(p.__dict__)
    
    # 删除
    # del p.age
    # print(p.__dict__)

    四、反射的运用

    class Test():
        def put(self,data):
            print(data)
    
        def auth(self,data):
            print(data)
    
        def __init__(self):
            data = input(">>").strip()
            if hasattr(self,data):
                func = getattr(self,data)
                func(data)
    
    if __name__ == '__main__':
        Test()
  • 相关阅读:
    java中的Iterator和Iterable 区别
    Ubuntu 12.04 部署 PostGIS 2.1
    postgres模板数据库
    在ubuntu 10.04 上QGIS的安装步骤
    js----解决异步之Generator && async
    js----promise.all() promise.race()
    js----异步之Promise,Generator,Async
    js----CSRF-跨站请求伪造攻击
    js----js实现继承的方式及其优缺点
    vue----nextTick获取最新dom结构
  • 原文地址:https://www.cnblogs.com/lilong74/p/11368492.html
Copyright © 2011-2022 走看看