Python自省机制
Python 自省机制
Python 自省(Introspection)是一种动态检查对象的能力,使得开发者可以在运行时获取对象的相关信息,比如属性、方法、类型等。自省机制让 Python 具备了更强的动态性和灵活性,便于调试和开发。
自省,在我们日常生活中,通常是自我反省的意思。
但在计算机编程中,自省并不是这个意思,表示的是自我检查的行为或能力。它的内容包括:
-
告诉别人,我是谁
-
告诉别人,我能做什么
以下是自省的一些常用方法和代码示例:
1. 检查对象的类型
type(obj)
: 返回对象的类型。isinstance(obj, ClassName)
: 检查对象是否是某个类或其子类的实例。
x = 10
print(type(x)) # <class 'int'>
print(isinstance(x, int)) # True
2. 获取对象的属性和方法
dir(obj)
: 返回对象的所有属性和方法,包含特殊属性和方法。
class MyClass:def __init__(self):self.value = 10def my_method(self):return "Hello!"obj = MyClass()
print(dir(obj)) # 列出 obj 的属性和方法
3. 检查对象的 ID 和哈希值
id(obj)
: 返回对象在内存中的唯一标识。hash(obj)
: 获取对象的哈希值(如果对象是可哈希的)。
print(id(obj)) # 对象的内存地址
print(hash(obj)) # 如果对象是可哈希的,返回哈希值
4. 检查类的基类和继承关系
obj.__class__
: 返回对象所属的类。obj.__class__.__bases__
: 返回类的基类信息。
print(obj.__class__) # <class '__main__.MyClass'>
print(obj.__class__.__bases__) # (<class 'object'>,)
5. 使用 getattr()
和 setattr()
getattr(obj, 'attr_name', default)
: 获取对象的指定属性。setattr(obj, 'attr_name', value)
: 动态设置对象的属性。
print(getattr(obj, 'value', None)) # 获取 value 属性
setattr(obj, 'value', 20) # 设置 value 属性
print(obj.value) # 20
6. 使用 hasattr()
检查属性是否存在
hasattr(obj, 'attr_name')
: 检查对象是否有某个属性。
print(hasattr(obj, 'value')) # True
7. 检查对象的文档字符串和源代码
obj.__doc__
: 获取对象的文档字符串。inspect.getsource(obj)
: 获取对象的源代码(需要导入inspect
模块)。
import inspectprint(obj.my_method.__doc__) # 方法的文档字符串
print(inspect.getsource(MyClass)) # 类的源代码
8. 获取函数参数信息
通过 inspect.signature()
可以检查函数的参数信息。
import inspectdef func(a, b=10, *args, **kwargs):passsig = inspect.signature(func)
print(sig) # (a, b=10, *args, **kwargs)
9. 判断对象是否可调用
在 Python 自省(Introspection)中,callable() 也是常用的一个方法,用于检查对象是否具有“可调用”的特性。因为 Python 的动态特性,callable() 可以帮助开发者在运行时判断一个对象是否能像函数一样被调用,这对于构建灵活的代码结构非常有帮助。
class MyClass:def __call__(self):return "I'm callable!"def my_function():return "I'm a function!"obj1 = MyClass()
obj2 = 42 # 一个不可调用的对象# 判断是否可调用
print(callable(my_function)) # True
print(callable(obj1)) # True,因为定义了 __call__ 方法
print(callable(obj2)) # False