反射(自省)

Posted dangrui0725

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射(自省)相关的知识,希望对你有一定的参考价值。

# 反射(也称为自省)

# 反射的概念:指程序可以访问、检测和修改它本身状态或行为的一种能力

# 四个可以实现反射的函数
# 下列方法适用于类和对象
# hasattr(object, name) 第一个参数传对象,第二个参数传一个字符串
# 判断object中有没有name属性
class A:
    a = aaa

    def __init__(self, name, addr):
        self.name = name
        self.addr = addr

    def test(self):
        print(test)


a = A(张三, 高新区)

print(hasattr(a, addr))  # true 对象中有addr这个数据属性
print(hasattr(a, test))  # true 对象中有test这个函数属性
print(a.__dict__)  # 只显示对象的数据属性,不显示函数属性

# getattr(object, name, [default]) 第一个参数传对象,第二个参数传一个字符串
# 获取object中name属性的值,没有相应属性时会报错,如果设置了default,则不会报错,会返回设置的default
print(getattr(a, addr))  # 高新区
print(getattr(a, test))  # <bound method A.test of <__main__.A object at 0x03D37790>>
print(getattr(a, test111, 这里设置了default))  # 这里设置了default

# setattr(x, y, v) 第一个参数传对象,第二个参数传要设置的key,第三个参数传要设置的value
# 新增或修改object中y属性的值
print(setattr(a, tel, 18919901111))  # 新增
print(setattr(a, addr, 不是高新区))  # 修改
print(a.__dict__)  # {‘name‘: ‘张三‘, ‘addr‘: ‘不是高新区‘, ‘tel‘: ‘18919901111‘}

# delattr(o, name) 第一个参数传对象,第二个参数为属性名的字符串
# 删除 object中name属性
print(delattr(a, tel))
print(delattr(a, addr))
print(a.__dict__)  # {‘name‘: ‘张三‘}


# 反射的应用场景:程序员A编写了一个类,但是没有完成去度假,程序员B使用A写的类,可以使用反射继续完成自己的代码
# 等A回来后继续完成类的定义并且去实现B想要的功能。这种方式也叫做可插拔设计

class FtpClient:  # 这个类是A写的,但是没有完成
    def __init__(self, addr):
        print(正在连接服务器, addr)
        self.addr = addr


f1 = FtpClient(192.168.8.8)  # B使用A的类实例化对象
if hasattr(f1, get):  # 判断f1对象是否有get函数属性
    func_get = getattr(f1, get)  # 如果有,则获取该函数属性的内存地址
    func_get()  # 执行该函数
else:  # 如果没有,再进行处理其它的逻辑
    print(不存在get方法)
    print(继续处理其它逻辑)
    
# 当A回来后编写了get方法,此时无需对B的代码进行修改

 

以上是关于反射(自省)的主要内容,如果未能解决你的问题,请参考以下文章

Python自省与反射

python中的反射和自省

反射(自省)

python学习之自省/反射

Python 自省指南与反射

Python的自省机制与Python 的反射机制