Python __dict__与dir()

  • Python __dict__与dir

    • __dict__属性
    • dir函数
    • 结论

转载请标明出处(http://blog.csdn.net/lis_12/article/details/53521554).

Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案。

__dict__与dir()的区别:

  1. dir()是一个函数,返回的是list;
  2. __dict__是一个字典,键为属性名,值为属性值;
  3. dir()用来寻找一个对象的所有属性,包括__dict__中的属性,__dict__是dir()的子集;

并不是所有对象都拥有__dict__属性。许多内建类型就没有__dict__属性,如list,此时就需要用dir()来列出对象的所有属性。

__dict__属性

__dict__是用来存储对象属性的一个字典,其键为属性名,值为属性的值。

#!/usr/bin/python
# -*- coding: utf-8 -*-
class A(object):class_var = 1def __init__(self):self.name = 'xy'self.age = 2@propertydef num(self):return self.age + 10def fun(self):passdef static_f():passdef class_f(cls):passif __name__ == '__main__':#主程序a = A()print a.__dict__   #{'age': 2, 'name': 'xy'}   实例中的__dict__属性print A.__dict__   '''类A的__dict__属性{'__dict__': <attribute '__dict__' of 'A' objects>, #这里如果想深究的话查看参考链接5'__module__': '__main__',               #所处模块'num': <property object>,               #特性对象 'class_f': <function class_f>,          #类方法'static_f': <function static_f>,        #静态方法'class_var': 1, 'fun': <function fun >, #类变量'__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None,                        #class说明字符串'__init__': <function __init__ at 0x0000000003451AC8>}'''a.level1 = 3a.fun = lambda :xprint a.__dict__  #{'level1': 3, 'age': 2, 'name': 'xy','fun': <function <lambda> at 0x>}print A.__dict__  #与上述结果相同A.level2 = 4print a.__dict__  #{'level1': 3, 'age': 2, 'name': 'xy'}print A.__dict__  #增加了level2属性print object.__dict__'''{'__setattr__': <slot wrapper '__setattr__' of 'object' objects>, '__reduce_ex__': <method '__reduce_ex__' of 'object' objects>, '__new__': <built-in method __new__ of type object at>, 等.....'''

从上述代码可知,

  1. 实例的__dict__仅存储与该实例相关的实例属性,

    正是因为实例的__dict__属性,每个实例的实例属性才会互不影响。

  2. 类的__dict__存储所有实例共享的变量和函数(类属性,方法等),类的__dict__并不包含其父类的属性。

dir()函数

​ dir()是Python提供的一个API函数,dir()函数会自动寻找一个对象的所有属性(包括从父类中继承的属性)。

​ 一个实例的__dict__属性仅仅是那个实例的实例属性的集合,并不包含该实例的所有有效属性。所以如果想获取一个对象所有有效属性,应使用dir()。

print dir(A)
'''
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'class_f', 'class_var', 'fun', 'level1', 'level2', 'name', 'num', 'static_f']
'''
a_dict = a.__dict__.keys()
A_dict = A.__dict__.keys()
object_dict = object.__dict__.keys()
print a_dict
print A_dict
print object_dict
'''
['fun', 'level1', 'age', 'name']['__module__', 'level2', 'num', 'static_f', '__dict__', '__weakref__', '__init__', 'class_f', 'class_var', 'fun', '__doc__']['__setattr__', '__reduce_ex__', '__new__', '__reduce__', '__str__', '__format__', '__getattribute__', '__class__', '__delattr__', '__subclasshook__', '__repr__', '__hash__', '__sizeof__', '__doc__', '__init__']
'''#因为每个类都有一个__doc__属性,所以需要去重,去重后然后比较
print set(dir(a)) == set(a_dict + A_dict + object_dict)  #True

结论

dir()函数会自动寻找一个对象的所有属性,包括__dict__中的属性。

__dict__是dir()的子集,dir()包含__dict__中的属性。

参考网址

  1. https://docs.python.org/2/howto/descriptor.html?highlight=descriptor%20protocol#id1
  2. http://stackoverflow.com/questions/4877290/what-is-the-dict-dict-attribute-of-a-python-class
  3. http://www.tuicool.com/articles/ZbQFF3u
  4. http://www.jb51.net/article/54540.htm
  5. http://blog.csdn.net/lis_12/article/details/53519060

19 Python __dict__与dir()区别相关推荐

  1. python中__dict__与dir()区别

    前言 Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案. __dict__与dir()的区别: dir()是一个函数,返回的是list: _ ...

  2. python __dict__ ,dir()

    Python __dict__与dir() Python __dict__与dir __dict__属性 dir函数 结论 转载请标明出处(http://blog.csdn.net/lis_12/ar ...

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

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

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

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

  5. 一文读懂 JavaScript 和 Python 九大语义区别

    作者 | Ruqayyah Sara 译者 | 弯月,责编 | 伍杏玲 出品 | CSDN(ID:CSDNnews) 我是一名全栈开发.前几天我一直在研究算法和数据结构,因为对于程序员而言,最重要能力 ...

  6. python编程语言-python与其他编程语言区别全在这

    码农阿勇 2020-02-05 19:10:00 对于接触过编程语言的人来说,如果要快速上手python,首先要了解python和其他编程语言的主要区别在哪?下边勇哥主要以使用较多的JAVA和C语言来 ...

  7. Python 2.x 与 Python 3.x 的区别

    前言 如果你是刚接触 Python 的初学者,那你可能是直接学习 Python 3.x 版本.对于 Python 2.x 的版本是不会有所接触.官方也宣布在 2020 停止对 Python 2.x 的 ...

  8. python工程师是什么专业-猎维科技告诉你人工智能工程师与Python工程师有什么区别?...

    学习Python就等于学习人工智能吗?当然不!千万不要混淆它们的概念!Python工程师并不等同于人工智能工程师.(关注公众号"猎维人工智能") Python工程师与人工智能工程师 ...

  9. php和python区别-PHP与Python语言有哪些区别之处?选择哪一个好?

    其实针对不同阶段的学者来说,他们的需求自然也有所不同.本篇文章主要分析了php和python哪个好以及介绍PHP与Python的区别之处,希望对还在为学习PHP和Python中哪一个语言而摇摆不定的朋 ...

最新文章

  1. 智能驾驶是否会“运动式”发展
  2. golang值为nil的channel
  3. HighNewTech:支付宝全球首发5G手机,四大逆天功能(防骗三折叠气味识别自由飞)!
  4. Go——Artifactory的AQL查询以及json解析解决方案
  5. http协议客户端向服务器端请求时一般需要发送的内容
  6. Cocos2d-x学习之创建Android工程和编译
  7. 【邮政编码识别】基于matlab灰度二值化邮政编码识别【含Matlab源码 788期】
  8. java textarea滚动条_java中swing的textArea滚动条显示不出来
  9. 抖音做综艺,差点意思
  10. 2018美赛D翻译从汽油驾驶到 E 驾驶( E 指电,而不是空)
  11. STM32F103红外遥控
  12. 手工焊接SSOP贴片元件步骤总结
  13. 什么是听觉?机器听觉?
  14. 如何把密度函数化为标准正态二维分布_高中就开始学的正态分布,原来如此重要...
  15. 微信朋友圈爬虫python_python爬虫24 | 搞事情了,用 Appium 爬取你的微信朋友圈。...
  16. C#发送邮件(阿里企业邮箱示例 包括各个类型的服务器及端口配置)
  17. Python数据分析_电商数据分析报告
  18. A. IQ test
  19. iOS端实现登录输入框的三种思路(包含UIBezierPath等)
  20. 编写自己的驱动过游戏保护-需要具备的理论知识

热门文章

  1. Linux 文件/文件夹无法删除问题解决方案
  2. OpenCASCADE入门指南
  3. 检测到可疑访问 php,php.net被Chrome/Firefox浏览器标注为可疑站点
  4. 修复恢复可疑的SQLServer数据库
  5. Rufus开源版U盘引导制作工具V3.16
  6. js或者jQuery模拟点击提交按钮button,触发提交操作
  7. OpenGL之路(一)OpenGL、gl、glu、glut的区别 + glut环境的搭建
  8. linux中time命令详解、脚本监控记录系统硬盘io值、定位linux系统中await值过高占用的盘、定位占用硬盘IO高的程序、iotop命令说明、lsof使用说明【可定位端口所占用程序等】
  9. leetcode-数组知识点(中等)
  10. Kotlin Flow 冷流 StateFlow 热流 StateFlow 的应用