阐述 Python自省(机制与函数) ?
Python中的自省(Introspection)是指程序能够在运行时检查自身的结构、类型、属性、方法、函数等的能力。Python提供了多种内建函数和模块来支持自省。
以下是Python自省的一些重要机制和函数:
- type() 函数:
type()
函数用于获取对象的类型。它可以接收一个参数,并返回该参数的类型。x = 10 print(type(x)) # 输出: <class 'int'>
- dir() 函数:
dir()
函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。class MyClass: def my_method(self): pass obj = MyClass() print(dir(obj)) # 输出: ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'my_method']
- hasattr(), getattr(), setattr(), delattr() 函数:
这些函数用于检查、获取、设置和删除对象的属性。class Person: def __init__(self, name): self.name = name p = Person("Alice") print(hasattr(p, "name")) # 输出: True print(getattr(p, "name")) # 输出: Alice setattr(p, "age", 30) print(p.age) # 输出: 30 delattr(p, "age") # print(p.age) # 这会引发 AttributeError,因为age属性已被删除
- inspect 模块:
inspect
模块提供了一系列功能强大的函数来帮助获取关于对象如模块、类、方法、函数、追踪记录、帧和代码的信息。import inspect def my_function(): pass print(inspect.getsource(my_function)) # 输出: 'def my_function():\n pass\n'
- vars() 函数:
vars()
函数返回对象object的属性和属性值的字典对象。如果没有提供参数,则返回当前局部符号表的字典。class MyClass: def __init__(self, x): self.x = x obj = MyClass(10) print(vars(obj)) # 输出: {'x': 10}
- callable() 函数:
callable()
函数用于检查一个对象是否是可调用的。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。def my_function(): pass print(callable(my_function)) # 输出: True print(callable(10)) # 输出: False
- isinstance() 和 issubclass() 函数:
isinstance()
函数来判断一个对象是否是一个已知的类型,类似于type()
。issubclass()
函数用于判断参数 class 是否是类型参数 classinfo 的子类。print(isinstance(10, int)) # 输出: True print(issubclass(bool, int)) # 输出: False,因为bool不是int的子类
这些机制和函数共同构成了Python强大的自省能力,使得开发者能够在运行时动态地获取和操作代码的结构和信息。