python 对象自省
简介
⾃省(introspection),在计算机编程领域⾥,是指在运⾏时来判断⼀个对象的类型的能⼒。
它是Python的强项之⼀。Python中所有⼀切都是⼀个对象,⽽且我们可以仔细勘察那些对
象。Python还包含了许多内置函数和模块来帮助我们。
dir
dir
是python进行自省的非常重要的函数,通过dir
函数可以获取到对象的所有属性及方法,以列表的形式返回,当未指定对象时,则显示当前作用域的所有属性和方法。
l = [1, 2, 3]
print(dir(l))
print(dir())
['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'l']
type与id
type
,大家都知道,默认是返回一个对象的类型,其实之前也介绍过,它是每个类的元类,可以动态创建类。
type(class_name:str, class_bases:tuple, class_attr_method:dict)
class_name:类的名称
class_bases:类的继承对象,默认未object,以元组形式
class_method:类的方法及属性,使用字典存放
id
可以返回任意不同种类对象的唯⼀ID,获取对象的内存地址,程序不同时间执行是不一样的。
l = [1, 2, 3]
print(id(l))
# 1923881162688
inspect
提供python对象的一些有用的信息,例如:
import inspect
class Test(object):
def __init__(self) -> None:
pass
@staticmethod
def static_method():
pass
@classmethod
def class_method(cls):
pass
# 判断是否是函数
print(inspect.isfunction(Test.static_method))
print(inspect.isfunction(Test.class_method))
# 判断是否是方法
print(inspect.ismethod(Test.static_method))
print(inspect.ismethod(Test.class_method))
# 获取类对象的查找顺序,主要针对于继承
print(inspect.getmro(Test))
True
False
False
True
(<class '__main__.Test'>, <class 'object'>)
由此可见,静态方法不是方法,是函数