基于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实现多线程暴力破解登陆路由器功能代码分享
Jan 04 Python
Python中使用pprint函数进行格式化输出的教程
Apr 07 Python
python中实现将多个print输出合成一个数组
Apr 19 Python
使用虚拟环境打包python为exe 文件的方法
Aug 29 Python
Python读取实时数据流示例
Dec 02 Python
PyCharm下载和安装详细步骤
Dec 17 Python
TensorFlow实现从txt文件读取数据
Feb 05 Python
Pyspark读取parquet数据过程解析
Mar 27 Python
实现ECharts双Y轴左右刻度线一致的例子
May 16 Python
python+openCV对视频进行截取的实现
Nov 27 Python
Django项目如何获得SSL证书与配置HTTPS
Apr 30 Python
Python采集爬取京东商品信息和评论并存入MySQL
Apr 12 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执行速度全攻略
2006/10/09 PHP
如何在PHP中使用Oracle数据库(2)
2006/10/09 PHP
PHP正确配置mysql(apache环境)
2011/08/28 PHP
php连接oracle数据库及查询数据的方法
2014/12/29 PHP
PHP 中使用ajax时一些常见错误总结整理
2017/02/27 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
2018/05/11 PHP
IE 条件注释详解总结(附实例代码)
2009/08/29 Javascript
求数组最大最小值方法适用于任何数组
2013/08/16 Javascript
浅谈JavaScript的事件
2015/02/27 Javascript
js+css实现文字散开重组动画特效代码分享
2015/08/21 Javascript
jQuery+HTML5美女瀑布流布局实现方法
2015/09/21 Javascript
Javascript类型转换的规则实例解析
2016/02/23 Javascript
javascript基础语法——全面理解变量和标识符
2016/06/02 Javascript
AngularJS自定义插件实现网站用户引导功能示例
2016/11/07 Javascript
JS正则表达式之非捕获分组用法实例分析
2016/12/28 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
2017/05/02 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
2017/06/20 Javascript
layui动态表头的实现代码
2019/08/22 Javascript
Vue实现开心消消乐游戏算法
2019/10/22 Javascript
vuex actions异步修改状态的实例详解
2019/11/06 Javascript
javascript运行机制之执行顺序理解
2020/08/03 Javascript
[01:46]新英雄登场
2019/09/10 DOTA
对Python 数组的切片操作详解
2018/07/02 Python
详解python selenium 爬取网易云音乐歌单名
2019/03/28 Python
深入了解Python iter() 方法的用法
2019/07/11 Python
python实现ip地址查询经纬度定位详解
2019/08/30 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
Keras设置以及获取权重的实现
2020/06/19 Python
Python 利用argparse模块实现脚本命令行参数解析
2020/12/28 Python
选购国际女性时装设计师品牌:IFCHIC(支持中文)
2018/04/12 全球购物
个性发展自我评价
2014/02/11 职场文书
《记金华的双龙洞》教学反思
2014/04/19 职场文书
委托书格式要求
2015/01/28 职场文书
发布会邀请函
2015/01/31 职场文书
2015年迎新晚会策划书
2015/07/16 职场文书
Redis持久化与主从复制的实践
2021/04/27 Redis