inspect 是 Python 标准库中的一个模块。于获取活动的对象信息,比如模块的、类、方法、函数、参数、源代码、文档字符串等。这对于编写动态代码、调试、以及创建需要自省(introspection)功能的库和框架非常有用。
例如,你可以使用 inspect 模块来获取一个函数的参数列表、注释、源代码等:
import inspect
def my_function(a, b=2, *args, **kwargs):
"""这是一个示例函数。"""
pass
# 获取函数签名
signature = inspect.signature(my_function)
print(signature)
# 获取函数的文档字符串
doc_string = inspect.getdoc(my_function)
print(doc_string)
# 获取函数的源代码(如果可用)
try:
source_code = inspect.getsource(my_function)
print(source_code)
except OSError:
print("源代码不可用")
你可以结合使用 inspect 和 Python 的内置函数(如 dir() 和 getattr())来探索一个实例化对象的信息。以下是一个例子,展示如何查看一个类实例化后的基本属性和方法:
import inspect
class MyClass:
def __init__(self, name, age):
self.name = name
self.age = age
def greet(self):
print(f"Hello, my name is {self.name} and I am {self.age} years old.")
# 实例化对象
my_instance = MyClass("Alice", 30)
# 使用 dir() 获取对象的所有属性和方法名
attributes_and_methods = dir(my_instance)
print("Attributes and Methods:", attributes_and_methods)
# 筛选并打印出实例变量(非方法)
instance_variables = [attr for attr in attributes_and_methods if not callable(getattr(my_instance, attr))]
print("Instance Variables:", instance_variables)
# 打印出某个特定实例变量的值
print("Name:", getattr(my_instance, 'name'))
# 如果你想查看方法(函数)的签名,可以使用 inspect.signature
greet_signature = inspect.signature(my_instance.greet)
print("greet Method Signature:", greet_signature)
# 如果你想查看方法的文档字符串
greet_docstring = inspect.getdoc(my_instance.greet)
print("greet Method Docstring:", greet_docstring)
# 注意:对于实例方法,通常直接使用 inspect.getdoc(MyClass.greet) 也是可以的
# 因为在 Python 中,实例方法和类方法是绑定的,但文档字符串存储在类级别
在这个例子中,我们首先定义了一个简单的类 MyClass,它有一个构造函数 __init__ 用于初始化实例变量 name 和 age,以及一个方法 greet 用于打印问候语。然后,我们实例化这个类,并使用 dir() 函数来获取对象的所有属性和方法名。通过进一步筛选,我们可以区分出哪些是实例变量(非方法),并打印出它们的名称和值。
对于方法,我们使用 inspect.signature() 来查看其签名,使用 inspect.getdoc() 来获取其文档字符串。不过,请注意,对于实例方法,直接通过类名访问并获取文档字符串通常也是可行的,因为 Python 中的实例方法是与类绑定的。
326

被折叠的 条评论
为什么被折叠?



