当前位置:  开发笔记 > 编程语言 > 正文

Python中的dir(...)和vars(...).keys()之间的区别?

如何解决《Python中的dir()和vars().keys()之间的区别?》经验,为你挑选了2个好方法。

Python dir(…)vars(…).keys()Python 之间有区别吗?

(我希望有区别,因为否则这会破坏"一种方法去做"原则...... :)



1> 小智..:

Python对象将它们的实例变量存储在属于该对象的字典中.vars(x)返回此字典(同样如此x.__dict__).dir(x)另一方面,它返回一个x's"属性的字典,它的类的属性,并递归地返回它类的基类的属性."

当您使用点运算符访问对象的属性时,python不仅仅在该对象字典中查找属性.一个常见的情况是何时x是类的对象,Cm在其上调用方法.

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__,找到它,并调用mx作为第一个参数.

所以之间的区别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()`则不会.
还可以通过实现`__dir__`魔术方法来定制`dir`的输出:`class A:def __dir __(self):return ['a']`然后你有`dir(A())== [ 'a']`而`vars(A())== {}`.

2> Paolo Bergan..:

该文档有这样的说法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__'])


我想这里的"符号表"是关键术语.在官方Python文档中很难找到它的定义(事实上,我还没有找到它:)).
推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有