📅  最后修改于: 2023-12-03 15:19:22.901000             🧑  作者: Mango
dir()
和 vars()
的区别在Python中,有两个函数——dir()
和 vars()
用于获取对象信息,两者有着不同的作用和用途。在本文中,我们将介绍它们的区别和用法。
dir()
dir()
是一个内置函数,它返回一个列表,列出了对象的所有属性和方法。这些属性和方法可以是对象本身的,也可以是其所继承类的。比如:
class Person:
name = 'Alice'
def say(self):
print('I am %s.' % self.name)
p = Person()
print(dir(p))
输出:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'say']
可以看到输出结果包含了Person
类的所有属性和方法,以及object
类的一些特殊属性和方法。
vars()
vars()
也是一个内置函数,但是它返回的是对象的__dict__
属性,这个属性是一个字典类型,包含了对象定义的所有属性和对应的值。比如:
class Person:
name = 'Alice'
def say(self):
print('I am %s.' % self.name)
p = Person()
print(vars(p))
输出:
{}
可以看到输出结果是一个空字典。因为在这个例子中,Person
类并没有实例化任何属性,所以p
对象也就没有任何属性。
vars()
和 __slots__
有一些时候,我们会定义一个类,并通过__slots__
来限制这个类的实例化对象只能有特定属性。在这种情况下,dir()
无法获取类的所有属性,而 vars()
只能返回允许的属性。比如:
class Person:
__slots__ = ['name']
name = 'Alice'
def say(self):
print('I am %s.' % self.name)
p = Person()
print(dir(p))
print(vars(p))
输出:
['__class__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', 'name', 'say']
{'name': 'Alice'}
可以看到,dir()
返回了不在__slots__
中的属性__slots__,而 vars()
返回了唯一允许的属性——name
。
dir()
获取所有属性和方法,包括类的和继承的。vars()
获取对象的__dict__
属性,仅限于对象的 attributes。如果没有 attributes,则返回空字典。__slots__
不会影响对象属性的可访问性,但会影响dir()
和vars()
的输出。