基于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引用模块和查找模块路径
Mar 17 Python
Python实现优先级队列结构的方法详解
Jun 02 Python
python win32 简单操作方法
May 25 Python
Python学习之Anaconda的使用与配置方法
Jan 04 Python
python print 按逗号或空格分隔的方法
May 02 Python
5分钟 Pipenv 上手指南
Dec 20 Python
python3去掉string中的标点符号方法
Jan 22 Python
Python计算时间间隔(精确到微妙)的代码实例
Feb 26 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
Jan 25 Python
python爬虫请求头设置代码
Jul 28 Python
python 用递归实现通用爬虫解析器
Apr 16 Python
python+pyhyper实现识别图片中的车牌号思路详解
Dec 24 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脚本的10个技巧(7)
2006/10/09 PHP
php写的简易聊天室代码
2011/06/04 PHP
如何使用PHP实现javascript的escape和unescape函数
2013/06/29 PHP
getJSON跨域SyntaxError问题分析
2014/08/07 PHP
Laravel 4 初级教程之安装及入门
2014/10/30 PHP
thinkPHP5.0框架环境变量配置方法
2017/03/17 PHP
thinkPHP框架中执行事务的方法示例
2018/05/31 PHP
php文件后缀不强制为.php的实操方法
2019/09/18 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
2020/01/22 PHP
JavaScript使用IEEE 标准进行二进制浮点运算产生莫名错误的解决方法
2011/05/28 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
javascript-解决mongoose数据查询的异步操作
2016/12/22 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(下)
2017/04/21 Javascript
详解利用jsx写vue组件的方法示例
2017/07/17 Javascript
使用nvm管理不同版本的node与npm的方法
2017/10/31 Javascript
浅谈webpack打包之后的文件过大的解决方法
2018/03/07 Javascript
vue导出html、word和pdf的实现代码
2018/07/31 Javascript
详解如何创建并发布一个 vue 组件
2018/11/08 Javascript
Angular6 发送手机验证码按钮倒计时效果实现方法
2019/01/08 Javascript
深入分析jQuery.one() 函数
2020/06/03 jQuery
Python3访问并下载网页内容的方法
2015/07/28 Python
Python从Excel中读取日期一列的方法
2018/11/28 Python
django框架forms组件用法实例详解
2019/12/10 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
2020/06/09 Python
详解python tkinter 图片插入问题
2020/09/03 Python
python Zmail模块简介与使用示例
2020/12/19 Python
Moda Italia荷兰:意大利男士服装
2019/08/31 全球购物
稽核岗位职责范本
2015/04/13 职场文书
2015年财务个人工作总结范文
2015/05/22 职场文书
2015年测量员工作总结
2015/05/23 职场文书
基石观后感
2015/06/12 职场文书
加薪申请书应该这样写!
2019/07/04 职场文书
quickjs 封装 JavaScript 沙箱详情
2021/11/02 Javascript
使用CSS实现音波加载效果
2023/05/07 HTML / CSS