Python dir(…)
和vars(…).keys()
Python 之间有区别吗?
(我希望有区别,因为否则这会破坏"一种方法去做"原则...... :)
Python对象将它们的实例变量存储在属于该对象的字典中.vars(x)
返回此字典(同样如此x.__dict__
).dir(x)
另一方面,它返回一个x
's"属性的字典,它的类的属性,并递归地返回它类的基类的属性."
当您使用点运算符访问对象的属性时,python不仅仅在该对象字典中查找属性.一个常见的情况是何时x
是类的对象,C
并m
在其上调用方法.
class C(object): def m(self): print "m" x = C() x.m()
该方法m
未存储在x.__dict__
.它是班级的一个属性C
.当你调用时x.m()
,python将首先查找m in x.__dict__
,但它找不到它.然而,它知道x
是一个实例C
,所以它未来在看C.__dict__
,找到它,并调用m
与x
作为第一个参数.
所以之间的区别vars(x)
,并dir(x)
是dir(x)
确实的在寻找额外的工作x
"对于那些从它访问属性的类(和其基地),而不仅仅是那些属性,它们存储在x
自己的符号表.在上面的示例中,vars(x)
返回一个空字典,因为x
没有实例变量.但是,dir(x)
退货
['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', 'm']
该文档有这样的说法dir
:
如果没有参数,则返回当前本地范围中的名称列表.使用参数,尝试返回该对象的有效属性列表.
这个关于vars
:
如果没有参数,则返回与当前本地符号表对应的字典.使用模块,类或类实例对象作为参数(或具有
__dict__
属性的任何其他对象),返回与对象的符号表对应的字典.
如果你没有看到差异,也许这会告诉你更多:
>>> dir(list) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delsli ce__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getit em__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__r educe__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__' , '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'a ppend', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort' ] >>> vars(list).keys() ['__getslice__', '__getattribute__', 'pop', 'remove', '__rmul__', '__lt__', '__s izeof__', '__init__', 'count', 'index', '__delslice__', '__new__', '__contains__ ', 'append', '__doc__', '__len__', '__mul__', 'sort', '__ne__', '__getitem__', ' insert', '__setitem__', '__add__', '__gt__', '__eq__', 'reverse', 'extend', '__d elitem__', '__reversed__', '__imul__', '__setslice__', '__iter__', '__iadd__', ' __le__', '__repr__', '__hash__', '__ge__']
如果您不想阅读,请dir
包含以下属性,而vars
不是:
>>> set(dir(list)).difference(vars(list).keys()) set(['__str__', '__reduce__', '__subclasshook__', '__setattr__', '__reduce_ex__' , '__format__', '__class__', '__delattr__'])