阐述 Python自省(机制与函数) ?

Python中的自省(Introspection)是指程序能够在运行时检查自身的结构、类型、属性、方法、函数等的能力。Python提供了多种内建函数和模块来支持自省。

以下是Python自省的一些重要机制和函数:

  1. type() 函数:
    type() 函数用于获取对象的类型。它可以接收一个参数,并返回该参数的类型。

    x = 10
    print(type(x))  # 输出: <class 'int'>
    
  2. 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']
    
  3. 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属性已被删除
    
  4. inspect 模块:
    inspect 模块提供了一系列功能强大的函数来帮助获取关于对象如模块、类、方法、函数、追踪记录、帧和代码的信息。

    import inspect
    
    def my_function():
       pass
    
    print(inspect.getsource(my_function))  # 输出: 'def my_function():\n    pass\n'
    
  5. vars() 函数:
    vars() 函数返回对象object的属性和属性值的字典对象。如果没有提供参数,则返回当前局部符号表的字典。

    class MyClass:
       def __init__(self, x):
           self.x = x
    
    obj = MyClass(10)
    print(vars(obj))  # 输出: {'x': 10}
    
  6. callable() 函数:
    callable() 函数用于检查一个对象是否是可调用的。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。

    def my_function():
       pass
    
    print(callable(my_function))  # 输出: True
    print(callable(10))  # 输出: False
    
  7. isinstance()issubclass() 函数:
    isinstance() 函数来判断一个对象是否是一个已知的类型,类似于 type()issubclass() 函数用于判断参数 class 是否是类型参数 classinfo 的子类。

    print(isinstance(10, int))  # 输出: True
    print(issubclass(bool, int))  # 输出: False,因为bool不是int的子类
    

这些机制和函数共同构成了Python强大的自省能力,使得开发者能够在运行时动态地获取和操作代码的结构和信息。

发表评论

后才能评论