我个人的理解 自省和反射一样
什么是自省
在日常生活中自省是一种自我检查的行为,而在计算机编程中。自省是指:检查某写事物以确定它是什么,
它知道什么以及可以做什么。自省向程序提供了极大的灵活性和可控力。或者可以说。在面向对象语言运行中就可以知道它是干什么的 运行时能够获知对象的类型。
Python中常见的自省
- dir
- type
- hasattr
- isinstance
通过这些函数,我们可以在运行的时候,得知道这些对象类型,判读某个对象是否存在,去访问这对象属性属性
type()
In [1]: _list = []In [2]: dir(_list)Out[2]:['__add__','__class__','__class_getitem__','__contains__','__delattr__','__delitem__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__getitem__','__gt__','__hash__','__iadd__','__imul__','__init__','__init_subclass__','__iter__','__le__','__len__','__lt__','__mul__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__reversed__','__rmul__','__setattr__','__setitem__','__sizeof__','__str__','__subclasshook__','append','clear','copy','count','extend','index','insert','pop','remove','reverse','sort']
hasattr()
对象拥有属性,并且 dir() 函数会返回这些属性的列表。但是,有时我们只想测试一个或多个属性是否存在。如果对象具有我们正在考虑的属性,那么通常希望只检索该属性。这个任务可以由 hasattr() 和 getattr() 函数来完成.
>>> hasattr(id, '__doc__')True
instance()
可以使用 isinstance() 函数测试对象,以确定它是否是某个特定类型或定制类的实例:
>>> isinstance("python", str)True
什么是反射
通过字符串的形式倒入模块/寻找指定方法。在python中常用的两种方式
Python中常见的反射
- getattr: 根据字符串的形式去某个模块中寻找东西
- hasattr: 根据字符串的形式去某个模块中判断东西是否存在
- setattr: 根据字符串的形式去某个模块中设置东西
- delattr: 根据字符串的形式去某个模块中删除东西
# __import__ 和 getattr 搭配使用 举例反射# test01def foo():print("我是foo")# test02if __name__ == '__main__':test01 = __import__("test01")if test01:test_foo = getattr(test01, "foo")test_foo()"""通过__import__ 动态倒入包。然后用getattr 使用方法 这些都是反射"""
关于自省 / 反射 的总结
自省:获取对象的能力
反射:操纵对象的能力
