# vars、dir、locals、globals

# vars

vars()​ 函数返回对象的 __dict__​ 属性。如果没有 __dict__​ 属性,该函数会尝试调用 object.__dict__​。如果对象没有 __dict__​ 属性,它会引发 TypeError​ 异常。 vars()​ 函数的返回值是字典类型,其中包含对象中定义的所有属性和它们的值。

如果没有参数,就打印当前调用位置的属性和属性值 类似 locals()。

下面是一个使用 vars()​ 的简单示例:

class MyClass:
    def __init__(self):
        self.x = 1
        self.y = 2

obj = MyClass()
print(vars(MyClass)) # {'__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x7f9c6cf7b5f0>}
print(vars(obj)) # `{'x': 1, 'y': 2}`
print(dir(obj)) # ['__doc__', '__init__', '__module__', 'x', 'y']
print(vars()) # {'obj': <__main__.MyClass instance at 0x7ff72c3ff320>, '__builtins__': <module '__builtin__' (built-in)>, '__file__': '/code/main.py3', '__package__': None, 'MyClass': <class __main__.MyClass at 0x7ff72c402258>, '__name__': '__main__', '__doc__': None}

这段代码定义了一个 MyClass​ 类,该类具有 x​ 和 y​ 两个属性。然后,我们创建了一个 MyClass​ 类的实例 obj​,并使用 vars()​ 函数获取它的属性字典。输出结果为 {'x': 1, 'y': 2}​,这是 obj​ 中的属性及其值的表示。

# dir

vars()​ 和 dir()​ 都是用于查看对象的属性和方法,但它们的用途略有不同。

dir(obj)​ 用于返回一个列表,列出了 obj​ 对象拥有的所有属性和方法名(包括内置和自定义属性、方法),返回的结果是一个字符串列表,可以通过下标或迭代方式访问,例如:

class MyClass:
    def __init__(self):
        self.x = 1
        self.y = 2
  
    def foo(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__', 'foo', 'x', 'y']


因此,可以说 dir()​ 是一个更通用的工具,返回的是字符串列表,方便在代码中处理,而 vars()​ 更方便在交互式环境下查看对象的属性和属性值。

# locals

locals()​函数返回当前作用域的局部变量字典,即函数中定义的变量,它们可以被直接访问。

# globals

globals()​函数返回全局变量的字典,即当前模块中定义的变量,可以通过模块名访问。