反射机制

'''
反射机制:
    通过字符串驱动代码,基于字符串找到对应模块之中的方法或属性。通过反射机制可以极大的简化代码逻辑,
    也可以让我们的程序具备一定的动态运行过程中自我修改的能力

    python中的反射机制主要是四种方法的调用:
        getattr()
        setattr()
        hasattr()
        delattr()

    getattr()方法,是所有反射方法中使用频率最高的。
    通过指定的字符串获取目标模块/类中的方法或属性,其实就是方法或属性的另一种调用形态。
    主要包含两个参数:
        1.目标参数:类的名称
        2.名称:字符串类型,通过名称实现对目标模块/类的对应属性或方法的调用
    该方法主要用于获取目标的属性或方法,如果是过去方法,需要在末尾添加括号()
    对于不存在的方法或属性,调用时会直接报错,如果担心报错可以提前用try...except括起来

    setattr()设置目标对象的属性,通过此方法可以为目标对象新增属性或修改已有属性的值。
        1.对于不存在的属性,执行新增操作
        2.对于已存在的属性,执行修改操作
        该方法对目标对象的方法无效

    hasattr()判断属性是否存在,如果存在返回True,否则返回False

    delattr()表示删除指定的属性:
        只能调用类本身,不能调用实例化对象
'''

from class08_reflect_yield.Dog import Dog

dog = Dog('QQ')
# print(dog.attr_02)
# dog.info(111)

# print(getattr(dog,'attr_03'))     #属性的调用,相当于dog.attr_01

# li = ['attr_01', 'attr_02', 'attr_03', 'attr_04']
'''
    通过for循环获取li中的每一个元素,然后判断元素是否为daog中的attr_01与attr_02
    用if判断实现:
    for i in li:
        if i == 'attr_01':
            dog.attr_01
        elif i == 'attr_02':
            dog.attr_02
        elif...
        如果从外部获取的数据很多,那么整个判断的内容就很多
'''

# for i in li:
#     print(getattr(dog, i))  # 基于反射机制实现对属性的获取
'''
dog.i的运行逻辑,实际效果
    dog.attr_01
    dog.attr_02
    dog.attr_03
    ...
'''

# getattr获取目标对象的方法
# getattr(dog, 'eat')()  # 相当于dog.eat()
# getattr(dog, 'info')('这是i参数的参数值')  # 需要传参的方法的调用示例
# print(getattr(dog,'info'))  #基于调用属性的方式来调用方法,会显示方法的基本信息

# print(getattr(Dog, 'attr_01'))
# getattr(Dog('QQ'), 'eat')()

# setattr方法示例
# print(getattr(dog,'attr_01'))   #修改前的属性值
# print(setattr(dog,'attr_01','修改后的属性'))  #对已有属性进行修改,setattr没有返回值
# print(getattr(dog,'attr_01'))   #修改后的值
# setattr(dog, 'attr_03', '这是新增属性')
# print(dog.attr_03)  # 此处代码有警告显示,这是正常现象,可以忽略。
# print(getattr(dog, 'attr_03'))

# 修改类属性
# setattr(Dog,'attr_01','这是修改后类的属性1')
# print(Dog.attr_01)

# hasattr示例
# print(hasattr(dog, 'attr_02'))  # dog有,则返回True
# print(hasattr(dog, 'attr_03'))  # dog没有,则返回False
# print(hasattr(dog,'eat'))   # 判断dog中是否包含有该方法名,而不是方法实际的内容。

#delattr示例
# delattr(dog,'attr_01')   # 报错
# delattr(Dog,'attr_01')  # dog没有,则返回False
# print(Dog.attr_01)
# print(dog.attr_01)
# delattr(Dog, 'eat')  # 删除Dog类的eat方法名,而非方法
# dog.eat()   # 调用失败是因为方法名称找不到了。而不是方法本身被删除了。

 

posted @ 2024-12-08 13:10  mafei666  阅读(16)  评论(0)    收藏  举报