📜  Python中 dir() 和 vars() 的区别(1)

📅  最后修改于: 2023-12-03 15:19:22.901000             🧑  作者: Mango

Python中 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()的输出。