基于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 14 Python
python中使用mysql数据库详细介绍
Mar 27 Python
mysql 之通过配置文件链接数据库
Aug 12 Python
Python面向对象编程基础解析(一)
Oct 26 Python
Python常见MongoDB数据库操作实例总结
Jul 24 Python
Python全局变量与局部变量区别及用法分析
Sep 03 Python
PHP统计代码行数的小代码
Sep 19 Python
Pycharm小白级简单使用教程
Jan 08 Python
Python如何实现自带HTTP文件传输服务
Jul 08 Python
python 实现波浪滤镜特效
Dec 02 Python
python 批量将中文名转换为拼音
Feb 07 Python
详解Python中下划线的5种含义
Jul 15 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/11/25 PHP
dedecms中常见问题修改方法总结
2007/03/21 PHP
PHP中使用匿名函数操作数据库的例子
2014/11/17 PHP
Jquery中显示隐藏的实现代码分析
2011/07/26 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
基于JavaScript代码实现pc与手机之间的跳转
2015/12/23 Javascript
基于Jquery和html5实现炫酷的3D焦点图动画
2016/03/02 Javascript
Angular 4依赖注入学习教程之Injectable装饰器(六)
2017/06/04 Javascript
JavaScript 值类型和引用类型的初次研究(推荐)
2017/07/19 Javascript
js处理包含中文的字符串实例
2017/10/11 Javascript
JS实现table表格固定表头且表头随横向滚动而滚动
2017/10/26 Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
2018/10/20 Javascript
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
javascript删除数组元素的七个方法示例
2019/09/09 Javascript
Vue基于localStorage存储信息代码实例
2020/11/16 Javascript
[00:32]2018DOTA2亚洲邀请赛iG出场
2018/04/03 DOTA
在Python的循环体中使用else语句的方法
2015/03/30 Python
Python实现全角半角字符互转的方法
2016/11/28 Python
Python字典中的键映射多个值的方法(列表或者集合)
2018/10/17 Python
python组合无重复三位数的实例
2018/11/13 Python
django使用F方法更新一个对象多个对象字段的实现
2020/03/28 Python
用Python开发app后端有优势吗
2020/06/29 Python
python字典key不能是可以是啥类型
2020/08/04 Python
sqlalchemy实现时间列自动更新教程
2020/09/02 Python
服装销售人员求职自我评价
2013/09/26 职场文书
实习鉴定评语
2014/01/19 职场文书
应聘医药销售自荐书范文
2014/02/08 职场文书
项目经理岗位职责
2015/01/31 职场文书
工程部岗位职责范本
2015/04/11 职场文书
公司员工培训管理制度
2015/08/04 职场文书
《圆明园的毁灭》教学反思
2016/02/16 职场文书
MySQL8.0无法启动3534的解决方法
2021/06/03 MySQL
MySQL中一条SQL查询语句是如何执行的
2022/04/08 MySQL
浅谈Node的内存泄露问题
2022/05/06 NodeJs
spring 项目实现限流方法示例
2022/07/15 Java/Android