python中dir()与__dict__属性的区别浅析

  • Post category:Python

当我们想对一个Python对象进行深入了解时,可以用dir()__dict__这两个属性来查看对象的属性和方法。虽然这两个属性都可以用来查看Python对象的相关信息,但是它们之间还是存在一些区别的。

dir()方法

dir()方法是Python内置函数之一,它用来列出一个对象内部的所有属性和方法,包括Python自己内建的属性和方法。例如,我们可以使用dir()方法来查看一个字符串对象的全部属性和方法:

s = 'hello world'
print(dir(s))

输出结果:

['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

可以看到,dir()方法返回了一个列表,其中包含了该字符串对象的全部属性和方法。注意,dir()方法返回的属性和方法列表并非一定完整,有些特定对象可能会隐藏一些属性和方法。

__dict__属性

__dict__是一个Python中的特殊属性,它是一个字典类型并存储了对象的全部属性信息。当我们要查询一个对象的全部属性时,可以使用该属性来查看:

class MyClass:
    def __init__(self, a, b):
        self.a = a
        self.b = b

obj = MyClass(1, 2)
print(obj.__dict__)

输出结果:

{'a': 1, 'b': 2}

这里我们创建了一个叫MyClass的类,它含有两个属性ab。通过创建类的一个实例化对象obj,并使用__dict__属性,我们可以查看到obj所包含的全部属性和属性值。

需要注意的是,某些特殊的对象可能不包含__dict__属性,此时我们就无法通过该属性来查看对象的属性信息。

区别与联系

总的来说,dir()__dict__属性可以用来查看对象的属性和方法。不过二者还是存在一些区别:

  • dir()方法能够直接列出对象中的所有属性和方法,包括Python自带属性和方法,但是并不会返回属性的值。
  • __dict__属性会返回对象中所有的属性信息,包括属性名和属性值,但是不会显示Python自带属性和方法。

一些示例:

class MyClass:
    class_var = 1

    def __init__(self, a, b):
        self.a = a
        self.b = b

    def my_method(self):
        print('called my_method')

obj = MyClass(1, 2)
print(dir(obj))

{'a': 1, 'b': 2, 'my_method': <function MyClass.my_method at 0x7f9c237bfcf8>}
print(obj.__dict__)

我们创建了一个MyClass类,它含有一个类变量class_var,一个初始化方法__init__和一个实例方法my_method。通过创建MyClass类的实例对象obj,它包含了两个实例属性ab,并且我们可以通过dir()方法来查看obj对象的所有属性和方法,包括它的实例方法my_method。而同时,__dict__属性也可以把obj对象的全部属性信息(包括ab)返回给我们。