基于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 04 Python
Python使用urllib模块的urlopen超时问题解决方法
Nov 08 Python
python中list循环语句用法实例
Nov 10 Python
简单谈谈Python中函数的可变参数
Sep 02 Python
Python操作MongoDB数据库的方法示例
Jan 04 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
Feb 03 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
Aug 10 Python
Python网络爬虫信息提取mooc代码实例
Mar 06 Python
python3.9实现pyinstaller打包python文件成exe
Dec 13 Python
Django中template for如何使用方法
Jan 31 Python
python实现自动清理文件夹旧文件
May 10 Python
python数据分析之单因素分析线性拟合及地理编码
Jun 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 高效率写法 推荐
2010/02/21 PHP
php include类文件超时问题处理
2015/02/06 PHP
PHP实现动态web服务器方法
2015/07/29 PHP
PHP中使用OpenSSL生成证书及加密解密
2017/02/05 PHP
jquery 1.3.2 IE8中的一点点的小问题解决方法
2009/07/10 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
javascript日期计算实例分析
2015/06/29 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
2015/09/18 Javascript
Node.js 实现简单小说爬虫实例
2016/11/18 Javascript
jQuery实现checkbox列表的全选、反选功能
2016/11/24 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
2018/01/13 Javascript
官方推荐react-navigation的具体使用详解
2018/05/08 Javascript
JavaScript ES2019中的8个新特性详解
2019/02/20 Javascript
理理Vue细节(推荐)
2019/04/16 Javascript
在layui中layer弹出层点击事件无效的解决方法
2019/09/05 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
2020/10/24 Javascript
python实现textrank关键词提取
2018/06/22 Python
python ftp 按目录结构上传下载的实现代码
2018/09/12 Python
学生信息管理系统python版
2018/10/17 Python
python 调用有道api接口的方法
2019/01/03 Python
详解Python匿名函数(lambda函数)
2019/04/19 Python
为什么黑客都用python(123个黑客必备的Python工具)
2020/01/31 Python
利用Python如何实时检测自身内存占用
2020/05/09 Python
.NET remoting的两种通道是什么
2016/05/31 面试题
params有什么用
2016/03/01 面试题
区域总监的岗位职责
2013/11/21 职场文书
护士自我介绍信
2014/01/13 职场文书
旷课检讨书3000字
2014/02/04 职场文书
2014年五一促销活动方案
2014/03/09 职场文书
2014年学前班工作总结
2014/12/08 职场文书
市场营销计划书范文
2015/01/16 职场文书
高中教师个人总结
2015/02/10 职场文书
2016大学迎新晚会开场白
2015/11/24 职场文书
煤矿安全学习心得体会
2016/01/18 职场文书
如何书写先进事迹材料?
2019/07/02 职场文书