基于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 相关文章推荐
把项目从Python2.x移植到Python3.x的经验总结
Apr 20 Python
Python程序中使用SQLAlchemy时出现乱码的解决方案
Apr 24 Python
Python自动扫雷实现方法
Jul 25 Python
Python实现图片拼接的代码
Jul 02 Python
Python redis操作实例分析【连接、管道、发布和订阅等】
May 16 Python
python pyinstaller打包exe报错的解决方法
Nov 02 Python
python实现一个点绕另一个点旋转后的坐标
Dec 04 Python
python对象销毁实例(垃圾回收)
Jan 16 Python
使用python无账号无限制获取企查查信息的实例代码
Apr 17 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
May 04 Python
在Pycharm中安装Pandas库方法(简单易懂)
Feb 20 Python
Python利用zhdate模块实现农历日期处理
Mar 31 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实现mysql同步的实现方法
2009/10/21 PHP
解析argc argv在php中的应用
2013/06/24 PHP
PHP实现的随机IP函数【国内IP段】
2016/07/20 PHP
PHP 自动加载的简单实现(推荐)
2016/08/12 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
深入分析PHP设计模式
2020/06/15 PHP
js判断设备是否为PC并调整图片大小
2014/02/12 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
2015/06/24 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
2015/10/17 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
2015/12/04 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
2015/12/14 Javascript
jQuery简单倒计时效果完整示例
2016/09/20 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
原生js实现回复评论功能
2017/01/18 Javascript
jquery之基本选择器practice(实例讲解)
2017/09/30 jQuery
Django与Vue语法的冲突问题完美解决方法
2017/12/14 Javascript
简单理解Vue中的nextTick方法
2018/01/30 Javascript
angular实现input输入监听的示例
2018/08/31 Javascript
JS实现倒序输出的几种常用方法示例
2019/04/13 Javascript
微信小程序修改checkbox的样式代码实例
2020/01/21 Javascript
vue实现购物车结算功能
2020/06/18 Javascript
小程序实现列表倒计时功能
2021/01/29 Javascript
python docx 中文字体设置的操作方法
2018/05/08 Python
Python爬虫基础之XPath语法与lxml库的用法详解
2018/09/13 Python
Django高级编程之自定义Field实现多语言
2019/07/02 Python
详解从Django Allauth中进行登录改造小结
2019/12/18 Python
在keras中实现查看其训练loss值
2020/06/16 Python
斯凯奇美国官网:SKECHERS美国
2016/08/20 全球购物
美国顶级水上运动专业店:Marine Products
2018/04/15 全球购物
装潢设计实习自我鉴定
2013/09/19 职场文书
口才训练演讲稿范文
2014/09/16 职场文书
导游词之鲁迅祖居
2019/10/17 职场文书
2020年个人安全保证书参考模板
2020/01/08 职场文书
Html5新增了哪些功能
2021/04/16 HTML / CSS
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript
Redis中key的过期删除策略和内存淘汰机制
2022/04/12 Redis