在 Python 中,vars() 是一个内置函数,它可以用来获取对象的属性字典。
1. vars() 函数的用法
无参数调用 vars():
当不带参数调用 vars() 时,它会返回当前本地作用域中的变量名和值组成的字典。
带参数调用 vars():
当传递一个对象作为参数时,vars() 会返回该对象的属性字典。这等价于 object.__dict__。
下面是一些示例:
# 无参数调用
x = 10
y = 20
print(vars())
# 输出: {'x': 10, 'y': 20, '__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}
# 带参数调用
class MyClass:
def __init__(self, a, b):
self.a = a
self.b = b
obj = MyClass(1, 2)
print(vars(obj))
# 输出: {'a': 1, 'b': 2}
在上面的例子中:
第一个 vars() 调用没有参数,因此它返回了当前局部作用域中的所有变量及其值。
第二个 vars() 调用传递了一个 MyClass 对象作为参数,因此它返回了该对象的属性字典
2. vars() 函数的常见用途
检查对象的属性
动态添加或修改对象属性
实现反射和元编程技术
下面介绍 vars() 函数的详细用法。
2.1 使用 vars() 获取模块属性
除了获取局部作用域和对象属性,vars() 也可以用于获取模块级别的属性:
import math
print(vars(math))
# 输出: {..., 'pi': 3.141592653589793, 'e': 2.718281828459045, ...}
2.2 使用 vars() 动态修改属性
由于 vars() 返回的是对象的属性字典,我们可以通过修改字典来动态修改对象的属性:
class MyClass:
def __init__(self, a, b):
self.a = a
self.b = b
obj = MyClass(1, 2)
print(vars(obj)) # 输出: {'a': 1, 'b': 2}
vars(obj)['a'] = 10
print(vars(obj)) # 输出: {'a': 10, 'b': 2}
2.3 使用 vars() 实现反射
反射是一种动态访问对象属性的技术,vars() 可以帮助我们实现这一点:
class MyClass:
def __init__(self, a, b):
self.a = a
self.b = b
def my_method(self):
print("This is my_method")
obj = MyClass(1, 2)
method_name = "my_method"
if method_name in vars(obj):
getattr(obj, method_name)() # 输出: This is my_method
2.4 使用 vars() 进行元编程
利用 vars() 可以实现一些元编程技术,比如动态添加或修改类的属性和方法:
class MyClass:
pass
obj = MyClass()
vars(MyClass)["new_attribute"] = 42
vars(obj)["new_method"] = lambda self: print("This is a new method")
print(MyClass.new_attribute) # 输出: 42
obj.new_method() # 输出: This is a new method
总之, vars() 是一个非常有用的 Python 内置函数,可以帮助您更好地了解和操作对象的属性。