python对象自省(introspection)
在计算机编程中,自省是指这种能力:检查某些事物以确定它是什么、它知道什么以及它能做什么。自省向程序员提供了极大的灵活性和控制力。
说的更简单直白一点:自省就是面向对象的语言所写的程序在运行时,能够知道对象的类型。简单一句就是,运行时能够获知对象的类型。
例如python, buby, object-C, c++都有自省的能力,这里面的c++的自省的能力最弱,只能够知道是什么类型,而像python可以知道是什么类型,还有什么属性。
Python中比较常见的自省(introspection)机制(函数用法)有: dir(),type(), hasattr(), isinstance(),通过这些函数,我们能够在程序运行时得知对象的类型,判断对象是否存在某个属性,访问对象的属性。参见下表:
函数 | 描述 |
dir() | 返回一个列表,存储该对象下能被 . 出的所有属性与方法。 |
hasattr() | 查看对象是否具有某种属性或方法,返回True或者False。 |
getattr() | 获取对象下的某一属性或方法。如被获取对象没有相应的属性或方法,则可以为其设置默认值。 |
setattr() | 设置对象下的某一属性的值,通常我们不会在对象外部为其新增某一方法,而是在在对象的类中进行设置。 |
delattr() | 删除对象中的某一属性或方法。 |
help() | 获取对象的帮助信息。注意,没有返回值!内部会调用print()进行打印操作。 |
issubclass() | 判断一个类是不是另一个类的子类 |
isinstance() | 判断一个对象是否是一个已知的类型 |
id() | 返回存储对象的内存地址编号 |
callable() | 判断对象是否可调用 |
【内置函数(Built-in Functions)https://docs.python.org/zh-cn/3/library/functions.html】
dir是用自省的最重要的函数之一。它返回一个列表,列出了一个对象所拥有的属性和方法。例如:
当你记不清一个对象所拥有的属性和方法,这会非常有帮助。
如果我们运行dir()而不传入参数,那么它会返回当前作用域的所有名字。
type函数返回一个对象的类型。例如:
inspect模块也提供了一些自省功能
inspect模块主要提供了四种用处:
1.对是否是模块、框架、函数进行类型检查
2.获取源码
3.获取类或者函数的参数信息
4.解析堆栈
要使用inspect 需要先 import inspect
关于inspect模块 参见 https://www.cnblogs.com/yaohong/p/8874154.html
示例、python的inspect模块的inspect.getmembers(),能够比dir()获取到更详尽的自省信息
import inspect
#示例对象--自定义函数
def foo(a: int, b: int):
return a + b
print(inspect.getmembers(foo)) #请将inspect.getmembers(foo)换为dir(foo)对比之
你可运行之看看。