Python3 vars() 函数详解 获取具有__dict__属性对象的所有属性字典
vars()
函数的主要作用是获取具有__dict__属性的模块、类、实例或者其他对象的__dict__属性。__dict__主要用于存储对象(可写)属性的字典或者其他映射对象,在没有传递参数时,vars()函数的结果与locals()的结果是一样的,但locals()仅对读取有用。
它是Python的内置函数,在python文件中直接可以使用。
语法
vars([object])
参数
object[可选] - 具有__dict__属性的对象
返回值
对象的__dict__属性的字典类型数据
实例
§ 实例1 - 不传递参数
在不传递参数的时候,var()的结果与locals()一致。
>>> vars()
#{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>}
>>> locals()
#{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>}
§ 实例2 - 类实例应用vars()
类的实例化对象是具有__dict__属性的。对它的任何属性赋值都可以被打印出来。
>>> class main:
... pass
...
>>> o = main()
>>> vars(o)
{}
>>> o.a = 123
>>> vars(o)
{'a': 123}
类本身也是具有__dict__属性的。但是直接读取类的__dict__返回的是它的映射代理。
>>> class main:
... a = 1
... b = 2
... c = 3
...
>>> vars(main)
mappingproxy({'__module__': '__main__', 'a': 1, 'b': 2, 'c': 3, '__dict__': <attribute '__dict__' of 'main' objects>, '__weakref__': <attribute '__weakref__' of 'main' objects>, '__doc__': None})
§ 实例3 - 另类用法(属性合并传递)
这个例子并不常用,但是在当前环境属性特别多的时候,又不想一个一个的赋值或传递,用这个办法也行。
首先声明了类以及类方法run,接收一个字典x,并且打印这个字典中的a、b、c三个属性。
然后在外部声明3个属性,实例化对象,使用vars()打印了一下当前域的属性字典。可以看到里面包含了a、b、c三个属性。
直接把vars()赋值给了类属性x。然后把它传递给了run()方法。
在这个例子中locals()具有相同的效果。
>>> class main:
... def run(self, x):
... print(x['a'], x['b'], x['c'])
...
>>> a = 1
>>> b = 2
>>> c = 3
>>> o = main()
>>> vars()
#{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'main': <class '__main__.main'>, 'o': <__main__.main object at 0x0000000001EBFA20>, 'a': 1, 'b': 2, 'c': 3}
>>> o.x = vars()
>>> o.run(o.x)
1 2 3