商城建站服务网站托管运营
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
