当我们想对一个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
的类,它含有两个属性a
和b
。通过创建类的一个实例化对象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
,它包含了两个实例属性a
和b
,并且我们可以通过dir()
方法来查看obj
对象的所有属性和方法,包括它的实例方法my_method
。而同时,__dict__
属性也可以把obj
对象的全部属性信息(包括a
和b
)返回给我们。