反射

一、什么是反射

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()
原文地址:https://www.cnblogs.com/lilong74/p/11368492.html