python的dir()和__dict__属性的区别
只要是有属性的数据对象(不一定是面向对象的对象实例,而是指具有数据类型的数据对象),都可以通过__dict__和dir()来显示数据对象的相关属性。
__dict__可以看作是数据对象的名称空间,所以只包含自己的属性,且可以直接增、删、改、查__dict__。- dir()可以看作是显示属性的包含显示,除了显示自己的还显示继承来的属性。
对于模块
参见:查看模块属性
对于类和对象
以下面的例子解释__dict__和dir()在应用于类和对象上的不同之处。
class supcls:
def hello(self):
self.data1 = 'hello'
class childcls(supcls):
def world(self):
self.data2 = "world"
在显示内容上
__dict__是个dict结构,仅仅只显示完全独属于自己的属性dir()是一个list结构,除了显示自己的属性,还显示父类继承而来的属性,比如从祖先类object中继承的属性
下面是__dict__在类属性上显示的结果。注意,这里用keys()只显示数据对象的属性名称,实际上__dict__中既包含了名称,也包含了值。
>>> childcls.__dict__.keys()
dict_keys(['__module__', 'world', '__doc__'])
>>> supcls.__dict__.keys()
dict_keys(['__module__', 'hello', '__dict__', '__weakref__', '__doc__'])
下面是dir()显示类属性时候的结果:
>>> dir(childcls)
['__class__', '__delattr__', '__dict__',
......
'hello', 'world']
>>> dir(supcls)
['__class__', '__delattr__', '__dict__',
......
'hello']
注意上面dir(childcls)的结果中含有hello属性,它是来自父类supcls的属性。dir()还显示了一大堆的下划线属性,它们基本上都是继承自祖先类object的属性。
再看看对类的实例对象,它们的显示结果。
>>> s = supcls()
>>> c = childcls()
>>> s.__dict__.keys()
dict_keys([])
>>> c.__dict__.keys()
dict_keys([])
>>> dir(s)
['__class__', '__delattr__', '__dict__',
......
'hello']
>>> dir(c)
['__class__', '__delattr__', '__dict__',
......
'hello', 'world']
设置对象自己的属性,再查看:
>>> s.hello()
>>> s.__dict__.keys()
dict_keys(['data1'])
>>> dir(s)
['__class__', '__delattr__', '__dict__',
......
'data1', 'hello']
>>> c.world()
>>> c.__dict__.keys()
dict_keys(['data2'])
>>> dir(c)
['__class__', '__delattr__', '__dict__',
......
'data2', 'hello', 'world']
>>> c.hello()
>>> c.__dict__.keys()
dict_keys(['data2', 'data1'])
>>> dir(c)
['__class__', '__delattr__', '__dict__',
......
'data1', 'data2', 'hello', 'world']
在作用上
__dict__是一个dict,它和数据对象的属性直接关联,可以直接通过__dict__访问、设置、修改、删除属性,比如类的对象实例可以通过self.x=3设置x属性,也可以通过__dict__['x']=3来设置属性x。而dir()函数仅仅只是展现一些属性。
例如:
>>> c.__dict__['newkey']="NEWKEY"
>>> c.__dict__.keys()
dict_keys(['data2', 'data1', 'newkey'])
上面通过__dict__设置了一个新属性newkey,现在newkey已经是对象c的一个对象属性了。上面的设置方式和c.newkey="NEWKEY"是等价的。
python的dir()和__dict__属性的区别的更多相关文章
- python基础教程:dir()和__dict__属性的区别
只要是有属性的数据对象(不一定是面向对象的对象实例,而是指具有数据类型的数据对象),都可以通过- ---- __dict__和dir()来显示数据对象的相关属性. __ dict__可以看作是数据对象 ...
- python 中dir()和__dict__的区别
Python __dict__与dir() 出处(http://blog.csdn.net/lis_12/article/details/53521554). Python下一切皆对象,每个对象都有多 ...
- python中dir(),__dict__
dir()是python的一个函数, dir()函数如果接受的参数是一个类,则返回这个类所有的类变量和方法 dir()函数如果接收的参数是一个类的实例,则返回这个实例所有的实例变量,对应的类的类变量, ...
- python中dir,__dict__ , __setitem__(),__getitem__()
class Testa: pass class Testb(object): pass if __name__ == '__main__': print 'testb = ',dir(Testb) p ...
- Python __dict__属性详解
本文转载自 https://www.cnblogs.com/alvin2010/p/9102344.html 感谢 //偏执 大佬 我们都知道Python一切皆对象,那么Python究竟是怎么管理对象 ...
- [Python] dir() 与 __dict__,__slots__ 的区别
首先需要知道的是,dir() 是 Python 提供的一个 API 函数,dir() 函数会自动寻找一个对象的所有属性,包括搜索 __dict__ 中列出的属性. 不是所有的对象都有 __dict__ ...
- python遍历并获取对象属性--dir(),__dict__,getattr,setattr
一.遍历对象的属性: 1.dir(obj) :返回对象的所以属性名称字符串列表(包括属性和方法). for attr in dir(obj): print(attr) 2.obj.__dict__:返 ...
- python的类变量与实例变量以及__dict__属性
关于Python的实例变量与类变量,先来看一段可能颠覆世界观的例子 #!/usr/bin/env python # -*- coding: utf_8 -*- # Date: 2016年10月10日 ...
- Python中对象实例的__dict__属性
实例的__dict__并不是一个方法,而是存储与该实例相关的实例属性的字典,对类中定义的方法(函数),方法名也是属性变量,类的__dict__存储所有实例共享的变量和函数(类属性,方法等),类的__d ...
随机推荐
- Eclipse导入web项目报错找不到HttpServletRequest解决方法
解决方法 右击项目-> Properties -> Java Build Path -> Add Library -> Server Runtime -> next -& ...
- STM32 HAL库的使用心得
1.I2C函数中HAL_I2C_Mem_Write和HAL_I2C_Master_Transmit有啥区别?{ 使用HAL_I2C_Mem_Write等于 先使用HAL_I2C_Master_Tran ...
- 导入Dynamic Web Project后程序有红叉但是可以运行
解决方法: 进入工程下的.setting文件夹,用记事本编辑org.eclipse.wst.common.project.facet.core.xml, 把<runtime name=" ...
- Linux 区别 chown和chmod的用法
chown用法用来更改某个目录或文件的用户名和用户组的chown 用户名:组名 文件路径(可以是就对路径也可以是相对路径)例1:chown root:root /tmp/tmp1就是把tmp下的tmp ...
- Dubbo 源码分析 - 服务引用
1. 简介 在上一篇文章中,我详细的分析了服务导出的原理.本篇文章我们趁热打铁,继续分析服务引用的原理.在 Dubbo 中,我们可以通过两种方式引用远程服务.第一种是使用服务直联的方式引用服务,第二种 ...
- 转载:Package by feature, not layer
原文地址:Package by feature, not layer Package by feature, not layer The first question in building an a ...
- Hadoop 电话通信清单
一.实例要求 现有一批电话通信清单,记录了用户A拨打某些特殊号码(如120,10086,13800138000等)的记录.需要做一个统计结果,记录拨打给用户B的所有用户A. 二.测试样例 样例输入: ...
- 【安全开发】浅谈JSP安全开发之XSS
前言 大家好,好男人就是我,我就是好男人,我就是-0nise.在各大漏洞举报平台,我们时常会看到XSS漏洞.那么问题来了,为何会出现这种漏洞?出现这种漏洞应该怎么修复?目录 1.XSS ...
- Javascript高级编程学习笔记(59)—— 事件(3)事件对象
事件对象 在触发DOM‘事件时,会产生一个事件对象 event 该对象包含着所有与事件有关的信息 所有浏览器都支持 event 对象但是支持的方式有所不同 DOM事件对象 兼容DOM的浏览器会将eve ...
- 1.TabActivity、视图树、动画
整个页面为TabActivity, 其中对TabWidget进行了一些改变,当切换页签时页签后面红色背景会以Translate动画形式移动到相对应的页签后. 布局 )); lastPosition = ...