赵走x博客
网站访问量:151905
首页
书籍
软件
工具
古诗词
搜索
登录
24、nonlocal
23、Python functools.wraps 深入理解
21、Image.rotate旋转90度图片被截取了
20、python的__get__方法看这一篇就足够了
19、结巴分词(自然语言处理之中文分词器)
18、virtualenv
17、Python string 去掉标点符号 最佳实践
16、python 字符串相似度
15、StringIO和BytesIO
14、基于Python __dict__与dir()的区别详解
13、 set()去重的底层原理
12、顺序表的原理与python中的list类型
11、psutil实现系统监控
10、NSQ
9、utf-8的中文是一个汉字占三个字节长度吗?
8、supervisor+gunicorn部署python web项目
7、socket编程
6、async
5、Python的共享经济
4、Python 内存分配时的小秘密
3、Python中的“特权种族”是什么?
2、装饰器
1、序列化与反序列化
14、基于Python __dict__与dir()的区别详解
资源编号:76290
Python
Python 查缺补漏
热度:83
来源:https://www.jb51.net/article/127063.htm
> 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__':
, #这里如果想深究的话查看参考链接5 '__module__': '__main__', #所处模块 'num':
, #特性对象 'class_f':
, #类方法 'static_f':
, #静态方法 'class_var': 1, 'fun':
, #类变量 '__weakref__':
, '__doc__': None, #class说明字符串 '__init__':
} ''' a.level1 = 3 a.fun = lambda :x print a.__dict__ #{'level1': 3, 'age': 2, 'name': 'xy','fun':
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__':
, '__reduce_ex__':
, '__new__':
, 等..... ''' ``` 从上述代码可知, 实例的`__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由`__dict__`和dir()引发的一些思考](https://www.jb51.net/article/127093.htm "浅谈Python由`__dict__`和dir()引发的一些思考") * [python中dir()与`__dict__`属性的区别浅析](https://www.jb51.net/article/152441.htm "python中dir()与`__dict__`属性的区别浅析")