首先需要知道的是,dir()是Python提供的一个API函数,dir()函数会自动寻找一个对象的所有属性,包括搜索__dict__中列出的属性。

不是所有的对象都有__dict__属性。例如,如果你在一个类中添加了__slots__属性,那么这个类的实例将不会拥有__dict__属性,但是dir()仍然可以找到并列出它的实例所有有效属性。

>>> classFoo(object):

...__slots__ = ('bar', )

... bar= 'spam'...>>> Foo.__dict__dict_proxy({'__module__': '__main__', 'bar': 'spam', '__slots__': ('bar',), '__doc__': None})>>> Foo().__dict__Traceback (most recent call last):

File"", line 1, in AttributeError:'Foo' object has no attribute '__dict__'

>>>dir(Foo)

['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', 'bar']>>>dir(Foo())

['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', 'bar']

同理许多内建类型都没有__dict__属性,例如list没有__dict__属性,但你仍然可以通过dir()列出list所有的属性。

>>> [].__dict__Traceback (most recent call last):

File"", line 1, in AttributeError:'list' object has no attribute '__dict__'

>>>dir([])

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

dir()函数和类实例

Python的实例拥有它们自己的__dict__,而它们对应的类也有自己的__dict__:

>>> classFoo(object):

... bar= 'spam'...>>> Foo().__dict__{}>>> Foo.__dict__dict_proxy({'__dict__': , '__weakref__': , '__module__': '__main__', 'bar': 'spam', '__doc__': None})

dir()函数会遍历Foo,Foo()和object的__dict__属性,从而为Foo类,它的实例以及它所有的被继承类创建一个完整有效的属性列表。

当你对一个类设置属性时,它的实例也会受到影响:

>>> f =Foo()>>>f.ham

Traceback (most recent call last):

File"", line 1, in AttributeError:'Foo' object has no attribute 'ham'

>>> Foo.ham = 'eggs'

>>>f.ham'eggs'

这是因为'ham'属性被添加到了Foo类的__dict__属性中:

>>> Foo.__dict__dict_proxy({'__module__': '__main__', 'bar': 'spam', 'ham': 'eggs', '__dict__': , '__weakref__': , '__doc__': None})>>> f.__dict__{}

尽管Foo的实例f自己的__dict__为空,但它还是能拥有作为类属性的'ham'。Python中,一个对象的属性查找顺序遵循首先查找实例对象自己,然后是类,接着是类的父类。

所以当你直接对一个实例设置属性时,会看到实例的__dict__中添加了该属性,但它所属的类的__dict__却不受影响。

>>> f.stack = 'overflow'

>>> f.__dict__{'stack': 'overflow'}>>> Foo.__dict__dict_proxy({'__module__': '__main__', 'bar': 'spam', 'ham': 'eggs', '__dict__': , '__weakref__': , '__doc__': None})

dir()所做的不是查找一个对象的__dict__属性(这个属性有时甚至都不存在),它使用的是对象的继承关系来反馈一个对象的完整的有效属性。

一个实例的__dict__属性仅仅是那个实例的局部属性集合,不包含该实例所有有效属性。所以如果你想获取一个对象所有有效属性,你应该使用dir()来替代__dict__或者__slots__。

pythondir什么意思_Python之dir()与__dict__的区别相关推荐

  1. Python之dir()与__dict__的区别

    Python之dir()与__dict__的区别 - iFantasticMe 原文  http://www.cnblogs.com/ifantastic/p/3768415.html 主题 Pyth ...

  2. python dict 属性_python的dir()和__dict__属性的区别

    python的dir()和__dict__属性的区别 发布时间:2018-12-08 14:54, 浏览次数:349 , 标签: python dir dict 只要是有属性的数据对象(不一定是面向对 ...

  3. Python dir和vars的区别

    dir()和vars()的区别就是 dir()只打印属性(属性,属性......) 而vars()则打印属性与属性的值(属性:属性值......) ex. >> a='aaaaaaaaaa ...

  4. python里help和dir的区别_Python中dir()与help()的使用

    python内置了很多内置函数.类方法属性及各种模块.当我们想要当我们想要了解某种类型有哪些属性方法以及每种方法该怎么使用时,我们可以使用dir()函数和help()函数在python ide交互式模 ...

  5. python的dir()和__dict__属性的区别

    只要是有属性的数据对象(不一定是面向对象的对象实例,而是指具有数据类型的数据对象),都可以通过- ---- __dict__和dir()来显示数据对象的相关属性. __ dict__可以看作是数据对象 ...

  6. 【python】实例属性的显示方法-dir、__dict__

    在测试实例的属性时,产生过一个误解. class Test():name = 'python'def printest():print 'Test'a = Test() print dir(a) pr ...

  7. python隐藏类的属性 重写__dir___python实例属性的显示方法-dir、__dict__

    在测试实例的属性时,产生过一个误解.class Test():    name = 'python'    def printest():        print 'Test'a = Test()p ...

  8. python里dir是什么意思_python中dir什么作用

    python中dir的作用是:1.dir函数传入数据类型返回该数据类型的所有内置方法:2.dir函数传入模块名返回该模块的所有属性和方法. dir() 内置函数的作用 python 内置方法有很多,无 ...

  9. dir在python中什么意思_python中dir是什么

    dir() 函数不带参数时,返回当前范围内的变量.方法和定义的类型列表:带参数时,返回参数的属性.方法列表.如果参数包含方法__dir__(),该方法将被调用.如果参数不包含__dir__(),该方法 ...

最新文章

  1. UVA1103 古代象形符号 Ancient Messages解题报告(DFS,字符串)难度⭐⭐⭐⭐
  2. ItemCommandVSItemDataBound
  3. 图解在emu8086中学习几条汇编语言常用语句
  4. 剑指offer:栈的压入、弹出序列
  5. mvvm 耗时加载进度条_ZK的实际应用:MVVM –加载和渲染数据
  6. aio nio aio_AIO的完整形式是什么?
  7. 多线程编译linux,linux下多线程下载工具axel的编译安装
  8. 国内外著名CAD、CAM雕刻软件介绍
  9. IDEA快捷键大全(超详细!)
  10. 74LS系列芯片简记——10-19
  11. 国际品牌会员俱乐部VTN甄选全球好物 把握消费升级趋势 引领品牌高质量发展
  12. html5的指南针app,HTML5 App实战(五):指南针
  13. Mac更新Moterey后Alfred无法使用有道词典workflow
  14. 记录-如何在集成RTL8168网卡的主板上安装ESXi6.0
  15. hibernate mysql 外键_如何在hibernate中设置关联会在数据库中生成外键
  16. 设置.md文件默认用Typora打开
  17. A. 【UNR #2】积劳成疾
  18. Lodop打印设计(PRINT_DESIGN)介绍
  19. 向量学习2:图形围绕自己中心旋转、围绕图形外或内任意点为中心旋转
  20. 手把手教你设置路由器端口映射

热门文章

  1. delphi libeay32 各版本_Zbrush各版本合集
  2. C++ : 构造函数,拷贝构造函数,移动构造函数,拷贝赋值运算符,移动赋值运算符应用场景
  3. NAND FLASH 和NOR FLASH工作原理
  4. Qt / 窗体设置 Qt::WA_TranslucentBackground 为全黑的原因
  5. VS2010 断点无法命中的解决方案
  6. 百度 Serverless 架构揭秘与应用实践
  7. uml 工具_【推荐】灵活而丰富UML建模工具Enterprise Architect!
  8. 最短路径之--floyd算法--多源最短路径
  9. python学习之路day05——cmd操作命令
  10. python 合并重叠数据