浅谈Python由__dict__和dir()引发的一些思考


Posted in Python onOctober 30, 2017

关于__dict__和dir()的区别和作用请参考这篇文章:

说下我当时遇到的问题:

class Demo:
  def __init__(self, name, age):
    self.name = name
    self.age = age
  def func(self):
    print('Hello {0}'.format(self.name))
>>> d1 = Demo('Pythoner', 24)
>>> hasattr(d1, 'func')
True
>>> d1.__dict__
{'age': 24, 'name': 'Pythoner'}
>>dir(d1)
[ 'age', 'func', 'name','__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

首先,我们知道实例方法也可以算作是属性,通过hasattr()函数可以验证.而 __dict__是用来存储对象属性的一个字典,但是它的返回值中并没有'func'!

再看dir()函数,它会自动寻找一个对象的所有属性(包括从父类中继承的属性),它的返回值中有'func'.

所以我推测,"实例方法"并不属于实例的"私有"属性,而是该类的所有实例所共享的属性!

实例得到私有属性需要一个"私有化"的过程,就像__init__初始化函数!

验证:

class Demo2:
  def __init__(self, name):
    self.name = name
  def func(self):
    print('----get arg country----')
    self.country = 'China'
>>> d2 = Demo2('Pythoner')
>>> d2.__dict__
{'name': 'Pythoner'}
>>> d2.func()
----get arg country----
>>> d2.__dict__
{'country': 'China', 'name': 'Pythoner'}

"实例方法"之所以被称为实例方法,或者说每个实例执行实例方法会因为各自私有属性的不同而产生不同的结果,是因为方法中的self参数.

实例在执行实例方法时会在其所属的类中寻找该方法,然后通过self参数将实例本身传递进去,实例的私有属性就一并进行了传递.通过self参数就实现了实例和方法的绑定.

总结

以上就是本文关于浅谈Python由__dict__和dir()引发的一些思考的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:浅谈使用Python变量时要避免的3个错误、深入理解Python中的*重复运算符等,如有不足之处,欢迎留言指出。

Python 相关文章推荐
python黑魔法之参数传递
Feb 12 Python
详解python的几种标准输出重定向方式
Aug 15 Python
Python通过matplotlib画双层饼图及环形图简单示例
Dec 15 Python
如何使用Python的Requests包实现模拟登陆
Apr 27 Python
python实现将一个数组逆序输出的方法
Jun 25 Python
Python-Tkinter Text输入内容在界面显示的实例
Jul 12 Python
对python中基于tcp协议的通信(数据传输)实例讲解
Jul 22 Python
python实现把两个二维array叠加成三维array示例
Nov 29 Python
Python selenium的基本使用方法分析
Dec 21 Python
python实现数据结构中双向循环链表操作的示例
Oct 09 Python
Pygame Event事件模块的详细示例
Nov 17 Python
Python与C++中梯度方向直方图的实现
Mar 17 Python
Android分包MultiDex策略详解
Oct 30 #Python
Python 判断是否为质数或素数的实例
Oct 30 #Python
基于Python __dict__与dir()的区别详解
Oct 30 #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
You might like
解析php中获取系统信息的方法
2013/06/25 PHP
php使用Cookie实现和用户会话的方法
2015/01/21 PHP
ecshop 2.72如何修改后台访问地址
2015/03/03 PHP
用jquery来定位
2007/02/20 Javascript
JS小功能(列表页面隔行变色)简单实现
2013/11/28 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
详解JavaScript中数组的相关知识
2015/07/29 Javascript
JS for循环中i++ 和 ++i的区别介绍
2016/07/20 Javascript
Sequelize中用group by进行分组聚合查询
2016/12/12 Javascript
javascript 判断当前浏览器版本并判断ie版本
2017/02/17 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
2017/03/02 Javascript
bootstrap常用组件之头部导航实现代码
2017/04/20 Javascript
Vuex中mutations与actions的区别详解
2018/03/01 Javascript
react中fetch之cors跨域请求的实现方法
2018/03/14 Javascript
Vue 中 filter 与 computed 的区别与用法解析
2019/11/21 Javascript
Python Matplotlib库入门指南
2015/05/18 Python
用pickle存储Python的原生对象方法
2017/04/28 Python
Python+OpenCV采集本地摄像头的视频
2019/04/25 Python
Python测试模块doctest使用解析
2019/08/10 Python
浅析python内置模块collections
2019/11/15 Python
PyTorch中反卷积的用法详解
2019/12/30 Python
Django自定义全局403、404、500错误页面的示例代码
2020/03/08 Python
Python命名空间及作用域原理实例解析
2020/08/12 Python
size?法国官网:英国伦敦的球鞋精品店
2020/03/15 全球购物
电气工程及其自动化学生实习自我鉴定
2013/09/19 职场文书
工程师自我评价怎么写
2013/09/19 职场文书
物业门卫岗位职责
2013/12/28 职场文书
幼儿园中秋节活动方案2013
2014/01/29 职场文书
优秀团支部事迹材料
2014/02/08 职场文书
宿舍违规用电检讨书
2014/02/16 职场文书
马云北大演讲完整版:真心话,什么才是阿里的核心竞争力?
2014/04/04 职场文书
导游词之山东孔庙
2019/11/04 职场文书
Python爬虫之自动爬取某车之家各车销售数据
2021/06/02 Python
MySql 缓存查询原理与缓存监控和索引监控介绍
2021/07/02 MySQL
详解CSS3.0(Cascading Style Sheet) 层叠级联样式表
2021/07/16 HTML / CSS
详解Spring Security如何在权限中使用通配符
2022/06/28 Java/Android