基于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 相关文章推荐
使用django-suit为django 1.7 admin后台添加模板
Nov 18 Python
基于ID3决策树算法的实现(Python版)
May 31 Python
Python使用itertools模块实现排列组合功能示例
Jul 02 Python
详解关于Django中ORM数据库迁移的配置
Oct 08 Python
python-opencv 将连续图片写成视频格式的方法
Jan 08 Python
Python flask框架实现查询数据库并显示数据
Jun 04 Python
Pycharm Git 设置方法
Sep 15 Python
python 读取、写入txt文件的示例
Sep 27 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
Nov 28 Python
解决pytorch 保存模型遇到的问题
Mar 03 Python
Python Socket编程详解
Apr 25 Python
python绘制箱型图
Apr 27 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防注
2007/01/15 PHP
php 如何获取数组第一个值
2013/08/06 PHP
PHP生成压缩文件实例
2015/02/07 PHP
thinkPHP5框架中widget的功能与用法详解
2018/06/11 PHP
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
div模拟选择框示例代码
2013/11/03 Javascript
Jquery中Event对象属性小结
2015/02/27 Javascript
Nodejs的express使用教程
2015/11/23 NodeJs
JavaScript保留关键字汇总
2015/12/01 Javascript
jQuery插件实现带圆点的焦点图片轮播切换
2016/01/18 Javascript
jQuery实现的多滑动门,多选项卡效果代码
2016/03/28 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
原生JavaScript实现日历功能代码实例(无引用Jq)
2019/09/23 Javascript
[02:11]DOTA2上海特级锦标赛主赛事第二日RECAP
2016/03/04 DOTA
[01:06:42]VP vs NewBee Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
python生成器的使用方法
2013/11/21 Python
在Django的form中使用CSS进行设计的方法
2015/07/18 Python
Python中绑定与未绑定的类方法用法分析
2016/04/29 Python
python实现冒泡排序算法的两种方法
2018/03/10 Python
python pandas dataframe 按列或者按行合并的方法
2018/04/12 Python
python使用rpc框架gRPC的方法
2018/08/24 Python
利用python list完成最简单的DB连接池方法
2019/08/09 Python
通过python3实现投票功能代码实例
2019/09/26 Python
python基于plotly实现画饼状图代码实例
2019/12/16 Python
Python 列表反转显示的四种方法
2020/11/16 Python
css3实现冲击波效果的示例代码
2018/01/11 HTML / CSS
加拿大女鞋品牌:ALDO
2016/11/13 全球购物
AE美国鹰日本官方网站: American Eagle Outfitters
2016/12/10 全球购物
皮姆斯勒语言学习:Pimsleur Language Programs
2018/06/30 全球购物
PHP如何删除一个Cookie值
2012/11/15 面试题
销售竞赛活动方案
2014/08/23 职场文书
出国留学英文自荐信
2015/03/25 职场文书
宾馆前台接待岗位职责
2015/04/02 职场文书
学习计划是什么
2019/04/30 职场文书
MySQL EXPLAIN输出列的详细解释
2021/05/12 MySQL
Python爬虫框架之Scrapy中Spider的用法
2021/06/28 Python