# 反射
'''
    反射的定义:主要是应用于类的对象上,在运行时,将对象中的属性和方法反射出来。
    使用场景:可以动态的向对象中添加属性和方法。也可以动态的调用对象中的方法或者属性。
    反射的常用方法:
        1.hasaattr(obj,str)
            判断输入的str字符串在对象obj中是否存在(属性或方法),存在返回True,否则返回False
        2.getattr(obj,str)
            将按照输入的str字符串在对象obj中查找。如找到同名属性,则返回该属性;如找到同名方法,则返回方法的引用,
            想要调用此方法得使用 getattr(obj,str)()进行调用。
            如果未能找到同名的属性或者方法,则抛出异常:AttributeError。
        3.setattr(obj,name,value)
            name为属性名或者方法名,value为属性值或者方法的引用
            1) 动态添加属性。如上
            2)动态添加方法。首先定义一个方法。再使用setattr(对象名,想要定义的方法名,所定义方法的方法名)
        4.delattr(obj,str)
            将你输入的字符串str在对象obj中查找,如找到同名属性或者方法就进行删除
'''


class Dog(object):
    def __init__(self, name):
        self.name = name

    def eat(self):
        print(f"{self.name}正在吃东西...")

dog = Dog("二哈")

# hasaattr的使用
# str = input("请输入你要判断的属性名或者方法名:")
# # print(hasattr(dog, str)) # 输入name --> 返回True,对象dog中确实存在name属性
# print(hasattr(dog, str)) # 输入age --> 返回False,对象dog中不存在age属性或者age方法

# # getattr的使用
# str = input("请输入你想要查找的属性名或者方法名:")
# print(getattr(dog, str)) # 输入name --> 返回二哈,对象dog中name的属性确实为二哈
# print(getattr(dog, str)) # 输入age --> 抛出异常 AttributeError: 'Dog' object has no attribute 'age'

# # setattr的使用
# name = input("请输入想要添加的属性名:")
# value = input("请输入想要添加的属性值:")
# # 添加属性
# setattr(dog, name , value) # name:age,value:5
# print(getattr(dog, name)) # 输出结果为:5,说明添加属性age成功。
# # 添加方法
# name = input("请输入想要添加的属性名:")
# def run():
#     print("二哈正在奔跑...")
# setattr(dog, name, run) # 此时的run为函数run的引用(相当于指针指向run函数)
# getattr(dog, name)() # 方法的调用

# delattr的使用
str = input("请输入想要删除的属性名或者方法名:")
print(getattr(dog, str)) # 输入str为name,返回二哈
delattr(dog, str) # 删除name属性
print(getattr(dog, str)) # 抛出异常 AttributeError: 'Dog' object has no attribute 'name'

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐