基于Python __dict__与dir()的区别详解


Posted in Python onOctober 30, 2017

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

__dict__与dir()的区别:

dir()是一个函数,返回的是list;

__dict__是一个字典,键为属性名,值为属性值;

dir()用来寻找一个对象的所有属性,包括__dict__中的属性,__dict__是dir()的子集;

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

__dict__属性

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

#!/usr/bin/python
# -*- coding: utf-8 -*-
class A(object):
  class_var = 1
  def __init__(self):
    self.name = 'xy'
    self.age = 2

  @property
  def num(self):
    return self.age + 10

  def fun(self):pass
  def static_f():pass
  def class_f(cls):pass

if __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 = 3
  a.fun = lambda :x
  print a.__dict__ #{'level1': 3, 'age': 2, 'name': 'xy','fun': <function <lambda> at 0x>}
  print A.__dict__ #与上述结果相同

  A.level2 = 4
  print 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>, 
  等.....
  '''

从上述代码可知,

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

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

类的__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__中的属性。

以上这篇基于Python __dict__与dir()的区别详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
学习python处理python编码问题
Mar 13 Python
python自动化测试实例解析
Sep 28 Python
DJANGO-ALLAUTH社交用户系统的安装配置
Nov 18 Python
在Python中操作列表之List.append()方法的使用
May 20 Python
python根据unicode判断语言类型实例代码
Jan 17 Python
Python 支付整合开发包的实现
Jan 23 Python
pytz格式化北京时间多出6分钟问题的解决方法
Jun 21 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
Nov 16 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
Dec 02 Python
Python如何在windows环境安装pip及rarfile
Jun 15 Python
python中的列表和元组区别分析
Dec 30 Python
Python实现双向链表
May 25 Python
浅谈使用Python变量时要避免的3个错误
Oct 30 #Python
Python中进程和线程的区别详解
Oct 29 #Python
python logging日志模块的详解
Oct 29 #Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
Oct 29 #Python
Python批量更改文件名的实现方法
Oct 29 #Python
python生成二维码的实例详解
Oct 29 #Python
python 读写中文json的实例详解
Oct 29 #Python
You might like
聊天室php&amp;mysql(三)
2006/10/09 PHP
php中导出数据到excel时数字变为科学计数的解决方法
2013/02/03 PHP
php 开发中加密的几种方法总结
2017/03/22 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
PHP实现将标点符号正则替换为空格的方法
2017/08/09 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
2019/10/11 PHP
JQuery实现鼠标滑过显示导航下拉列表
2013/09/12 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
JavaScript将数组转换成CSV格式的方法
2015/03/19 Javascript
浅谈Jquery为元素绑定事件
2015/04/27 Javascript
JS对字符串编码的几种方式使用指南
2015/05/14 Javascript
如何用angularjs制作一个完整的表格
2016/01/21 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
2016/06/01 Javascript
JavaScript之cookie技术详解
2016/11/18 Javascript
JavaScript基础之流程控制语句的用法
2017/08/31 Javascript
angular 组件通信的几种实现方式
2018/07/13 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
2019/09/04 Javascript
js实现简单选项卡制作
2020/08/05 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
如何在vue 中使用柱状图 并自修改配置
2021/01/21 Vue.js
EM算法的python实现的方法步骤
2018/01/02 Python
Django异步任务之Celery的基本使用
2019/03/23 Python
pytorch 自定义卷积核进行卷积操作方式
2019/12/30 Python
Python垃圾回收机制三种实现方法
2020/04/27 Python
详解pandas.DataFrame.plot() 画图函数
2020/06/14 Python
python 实现全球IP归属地查询工具
2020/12/18 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
2021/01/29 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
印度最大的旅游网站:MakeMyTrip
2016/10/05 全球购物
双方协议书
2014/04/22 职场文书
语文高效课堂实施方案
2014/05/03 职场文书
人民调解员先进事迹材料
2014/05/08 职场文书
纪念九一八事变演讲稿:勿忘国耻
2014/09/14 职场文书
有关三国演义的读书笔记
2015/06/25 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书