自省与反射机制
自省
在日常生活中,自省(introspection)是一种自我检查行为。
在计算机编程中,自省是指这种能力:检查对象以确定它是什么类型、它有哪些属性和哪些方法。自省向程序员提供了极大的灵活性和控制力。
python中的自省函数有很多,凡是可以检查对象状态的函数都可以称为自省函数,常用的自省函数如下:
type
type函数可以返回一个对象的类型
>>> type(1)
int
isinstance
检查一个对象是否是某个或某些类型的实例
>>> isinstance(1, int)
True
issubclass
检查一个类是否是某个或某些类的子类
>>> issubclass(bool, int)
True
dir
返回一个传入对象的属性名和方法名的字符串列表
>>> print(dir(1))
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
反射
反射就是动态的操作对象。
简单的讲就是根据字符串形式的属性名方法名操作对应的对象。
python中的反射函数如下:
hasattr
检查一个对象是否有给定名称的属性
>>> hasattr([1,2,3], 'append')
True
getattr
返回一个对象给定名称的属性
getattr(x,'y')
等价于 x.y
>>> class Point:
... name = '点'
>>> getattr(Point,'name')
'点'
setattr
给一个对象添加一个给定名称的属性
setattr(x, 'y', v)
等价于 x.y = v
>>> setattr(Point,'x',1)
>>> Point.x
1
delattr
删除对象的一个给定名称的属性
delattr(x, 'y')
等价于del x.y
>>> delattr(Point, 'x')
>>> Point.x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'Point' has no attribute 'x'
自省和反射机制的灵活运行需要大量的练习和阅读源码。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!