我个人的理解 自省和反射一样

直接上一个案例来熟悉下自省

什么是自省

在日常生活中自省是一种自我检查的行为,而在计算机编程中。自省是指:检查某写事物以确定它是什么,
它知道什么以及可以做什么。自省向程序提供了极大的灵活性和可控力。或者可以说。在面向对象语言运行中就可以知道它是干什么的 运行时能够获知对象的类型

Python中常见的自省

  • dir
  • type
  • hasattr
  • isinstance

通过这些函数,我们可以在运行的时候,得知道这些对象类型,判读某个对象是否存在,去访问这对象属性属性

type()
  1. In [1]: _list = []
  2. In [2]: dir(_list)
  3. Out[2]:
  4. ['__add__',
  5. '__class__',
  6. '__class_getitem__',
  7. '__contains__',
  8. '__delattr__',
  9. '__delitem__',
  10. '__dir__',
  11. '__doc__',
  12. '__eq__',
  13. '__format__',
  14. '__ge__',
  15. '__getattribute__',
  16. '__getitem__',
  17. '__gt__',
  18. '__hash__',
  19. '__iadd__',
  20. '__imul__',
  21. '__init__',
  22. '__init_subclass__',
  23. '__iter__',
  24. '__le__',
  25. '__len__',
  26. '__lt__',
  27. '__mul__',
  28. '__ne__',
  29. '__new__',
  30. '__reduce__',
  31. '__reduce_ex__',
  32. '__repr__',
  33. '__reversed__',
  34. '__rmul__',
  35. '__setattr__',
  36. '__setitem__',
  37. '__sizeof__',
  38. '__str__',
  39. '__subclasshook__',
  40. 'append',
  41. 'clear',
  42. 'copy',
  43. 'count',
  44. 'extend',
  45. 'index',
  46. 'insert',
  47. 'pop',
  48. 'remove',
  49. 'reverse',
  50. 'sort']

hasattr()

对象拥有属性,并且 dir() 函数会返回这些属性的列表。但是,有时我们只想测试一个或多个属性是否存在。如果对象具有我们正在考虑的属性,那么通常希望只检索该属性。这个任务可以由 hasattr() 和 getattr() 函数来完成.

  1. >>> hasattr(id, '__doc__')
  2. True

instance()

 可以使用 isinstance() 函数测试对象,以确定它是否是某个特定类型或定制类的实例:

  1. >>> isinstance("python", str)
  2. True

什么是反射

通过字符串的形式倒入模块/寻找指定方法。在python中常用的两种方式

Python中常见的反射

  • getattr: 根据字符串的形式去某个模块中寻找东西
  • hasattr: 根据字符串的形式去某个模块中判断东西是否存在
  • setattr: 根据字符串的形式去某个模块中设置东西
  • delattr: 根据字符串的形式去某个模块中删除东西


  1. # __import__ 和 getattr 搭配使用 举例反射
  2. # test01
  3. def foo():
  4. print("我是foo")
  5. # test02
  6. if __name__ == '__main__':
  7. test01 = __import__("test01")
  8. if test01:
  9. test_foo = getattr(test01, "foo")
  10. test_foo()
  11. """
  12. 通过__import__ 动态倒入包。然后用getattr 使用方法 这些都是反射
  13. """

关于自省 / 反射 的总结

 自省:获取对象的能力
 反射:操纵对象的能力