基于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 socket编程实例详解
May 27 Python
深入理解Python装饰器
Jul 27 Python
Python温度转换实例分析
Jan 17 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
Mar 13 Python
详解Python3.6安装psutil模块和功能简介
May 30 Python
Python自定义装饰器原理与用法实例分析
Jul 16 Python
Python用5行代码写一个自定义简单二维码
Oct 21 Python
Django REST framework 如何实现内置访问频率控制
Jul 23 Python
keras使用Sequence类调用大规模数据集进行训练的实现
Jun 22 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
Aug 07 Python
Python学习工具jupyter notebook安装及用法解析
Oct 23 Python
关于Python中*args和**kwargs的深入理解
Aug 07 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
打造计数器DIY三步曲(下)
2006/10/09 PHP
使用PHP获取网络文件的实现代码
2010/01/01 PHP
php 截取字符串并以零补齐str_pad() 函数
2011/05/07 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
2014/09/02 PHP
PHP receiveMail实现收邮件功能
2018/04/25 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
jQuery.extend 函数的详细用法
2012/06/27 Javascript
Jquery倒数计时按钮setTimeout的实例代码
2013/07/04 Javascript
让复选框只能选择一项的方法
2013/10/08 Javascript
jQuery实现当前页面标签高亮显示的方法
2015/03/10 Javascript
jQuery的load()方法及其回调函数用法实例
2015/03/25 Javascript
js中less常用的方法小结
2017/08/09 Javascript
详解a标签添加onclick事件的几种方式
2019/03/29 Javascript
Vue全局loading及错误提示的思路与实现
2019/08/09 Javascript
使用vue重构资讯页面的实例代码解析
2019/11/26 Javascript
深入了解JS之作用域和闭包
2020/06/16 Javascript
vue+canvas实现拼图小游戏
2020/09/18 Javascript
[41:11]完美世界DOTA2联赛PWL S2 Inki vs Magma 第一场 11.22
2020/11/24 DOTA
python小技巧之批量抓取美女图片
2014/06/06 Python
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
Python代码解决RenderView窗口not found问题
2016/08/28 Python
Python学习思维导图(必看篇)
2017/06/26 Python
python生成以及打开json、csv和txt文件的实例
2018/11/16 Python
Python随机函数库random的使用方法详解
2019/08/21 Python
pd.DataFrame统计各列数值多少的实例
2019/12/05 Python
Python socket聊天脚本代码实例
2020/01/02 Python
python获取栅格点和面值的实现
2020/03/10 Python
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
工程师岗位职责
2013/11/08 职场文书
文员岗位职责
2013/11/09 职场文书
茶叶店创业计划书范文
2014/01/19 职场文书
三年级班级文化建设方案
2014/05/04 职场文书
汽车转让协议书范本
2014/12/07 职场文书
告知书格式
2015/07/01 职场文书
初中团委工作总结
2015/08/13 职场文书
Windows server 2016服务器基本设置
2022/08/14 Servers