2022年 11月 5日

Python中的反射

  1. # 反射
  2. '''
  3. 反射的定义:主要是应用于类的对象上,在运行时,将对象中的属性和方法反射出来。
  4. 使用场景:可以动态的向对象中添加属性和方法。也可以动态的调用对象中的方法或者属性。
  5. 反射的常用方法:
  6. 1.hasaattr(obj,str)
  7. 判断输入的str字符串在对象obj中是否存在(属性或方法),存在返回True,否则返回False
  8. 2.getattr(obj,str)
  9. 将按照输入的str字符串在对象obj中查找。如找到同名属性,则返回该属性;如找到同名方法,则返回方法的引用,
  10. 想要调用此方法得使用 getattr(obj,str)()进行调用。
  11. 如果未能找到同名的属性或者方法,则抛出异常:AttributeError。
  12. 3.setattr(obj,name,value)
  13. name为属性名或者方法名,value为属性值或者方法的引用
  14. 1) 动态添加属性。如上
  15. 2)动态添加方法。首先定义一个方法。再使用setattr(对象名,想要定义的方法名,所定义方法的方法名)
  16. 4.delattr(obj,str)
  17. 将你输入的字符串str在对象obj中查找,如找到同名属性或者方法就进行删除
  18. '''
  19. class Dog(object):
  20. def __init__(self, name):
  21. self.name = name
  22. def eat(self):
  23. print(f"{self.name}正在吃东西...")
  24. dog = Dog("二哈")
  25. # hasaattr的使用
  26. # str = input("请输入你要判断的属性名或者方法名:")
  27. # # print(hasattr(dog, str)) # 输入name --> 返回True,对象dog中确实存在name属性
  28. # print(hasattr(dog, str)) # 输入age --> 返回False,对象dog中不存在age属性或者age方法
  29. # # getattr的使用
  30. # str = input("请输入你想要查找的属性名或者方法名:")
  31. # print(getattr(dog, str)) # 输入name --> 返回二哈,对象dog中name的属性确实为二哈
  32. # print(getattr(dog, str)) # 输入age --> 抛出异常 AttributeError: 'Dog' object has no attribute 'age'
  33. # # setattr的使用
  34. # name = input("请输入想要添加的属性名:")
  35. # value = input("请输入想要添加的属性值:")
  36. # # 添加属性
  37. # setattr(dog, name , value) # name:age,value:5
  38. # print(getattr(dog, name)) # 输出结果为:5,说明添加属性age成功。
  39. # # 添加方法
  40. # name = input("请输入想要添加的属性名:")
  41. # def run():
  42. # print("二哈正在奔跑...")
  43. # setattr(dog, name, run) # 此时的run为函数run的引用(相当于指针指向run函数)
  44. # getattr(dog, name)() # 方法的调用
  45. # delattr的使用
  46. str = input("请输入想要删除的属性名或者方法名:")
  47. print(getattr(dog, str)) # 输入str为name,返回二哈
  48. delattr(dog, str) # 删除name属性
  49. print(getattr(dog, str)) # 抛出异常 AttributeError: 'Dog' object has no attribute 'name'