我个人的理解 自省和反射一样
什么是自省
在日常生活中自省是一种自我检查的行为,而在计算机编程中。自省是指:检查某写事物以确定它是什么,
它知道什么以及可以做什么。自省向程序提供了极大的灵活性和可控力。或者可以说。在面向对象语言运行中就可以知道它是干什么的 运行时能够获知对象的类型。
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 搭配使用 举例反射
# test01
def foo():
print("我是foo")
# test02
if __name__ == '__main__':
test01 = __import__("test01")
if test01:
test_foo = getattr(test01, "foo")
test_foo()
"""
通过__import__ 动态倒入包。然后用getattr 使用方法 这些都是反射
"""
关于自省 / 反射 的总结
自省:获取对象的能力
反射:操纵对象的能力