当前位置: 首页 > news >正文

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
http://www.lryc.cn/news/470156.html

相关文章:

  • wgan-gp 对连续变量 训练,6万条数据,训练结果不错,但是到局部的时候,拟合不好,是否可以对局部数据也进行计算呢
  • python 制作 发货单 (生成 html, pdf)
  • GeoWebCache1.26调用ArcGIS切片
  • 深度学习-卷积神经网络-基于VGG16模型, 实现猫狗二分类(文末附带数据集下载链接, 长期有效)
  • 计算Java集合占用的空间【详解】
  • 仕考网:关于中级经济师考试的介绍
  • SYN590RL 300MHz至450MHz ASK接收机芯片IC
  • 15分钟学 Go 第 20 天:Go的错误处理
  • C++——string的模拟实现(上)
  • JavaCV 之均值滤波:图像降噪与模糊的权衡之道
  • 桥接模式,外界与主机通,与虚拟机不通
  • 用HTML构建酷炫的文件上传下载界面
  • Gateway 统一网关
  • 7 种常见的前端攻击
  • element plus实现点击上传于链接上传并且回显到upload组件中
  • ELK日志分析系统部署
  • 驾校小程序:一站式学车解决方案的设计与实践
  • 【自然语言处理】BERT模型
  • Android 添加如下飞行模式(飞行模式开和关、飞行模式开关菜单显示隐藏)接口
  • 【Vue3】基于 Vue3 + ECharts 实现北京市区域地图可视化
  • 【IC】什么是min period check
  • MyBatis入门之一对多关联关系(示例)
  • 【Git 】Windows 系统下 Git 文件名大小写不敏感
  • 【算法系列-二叉树】层序遍历
  • 我的世界方块改进版
  • 博客搭建之路:hexo增加搜索功能
  • 2024年最新互联网大厂精选 Java 面试真题集锦(JVM、多线程、MQ、MyBatis、MySQL、Redis、微服务、分布式、ES、设计模式)
  • MybatisPlus入门(一)MybatisPlus简介
  • QoS学习笔记
  • 图(邻接矩阵)知识大杂烩!!(邻接矩阵结构,深搜,广搜,prim算法,kruskal算法,Dijkstra算法,拓扑排序)(学会一文让你彻底搞懂!!)