浅谈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文本操作相关模块
Jun 22 Python
Python3调用微信企业号API发送文本消息代码示例
Nov 10 Python
python实现多人聊天室
Mar 31 Python
python实现广度优先搜索过程解析
Oct 19 Python
在Python中使用filter去除列表中值为假及空字符串的例子
Nov 18 Python
Python编写一个验证码图片数据标注GUI程序附源码
Dec 09 Python
jupyter notebook oepncv 显示一张图像的实现
Apr 24 Python
python下对hsv颜色空间进行量化操作
Jun 04 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
Aug 07 Python
python利用递归方法实现求集合的幂集
Sep 07 Python
Python列表推导式实现代码实例
Sep 09 Python
Python 删除List元素的三种方法remove、pop、del
Nov 16 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
yii框架通过控制台命令创建定时任务示例
2014/04/30 PHP
PHP小教程之实现双向链表
2014/06/12 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
2015/02/14 PHP
PHP生成静态HTML文档实现代码
2016/06/23 PHP
PHP实现的超长文本分页显示功能示例
2018/06/04 PHP
PHP正则表达式笔记与实例详解
2019/05/09 PHP
js checkbox(复选框) 使用集锦
2009/04/28 Javascript
javascript 构建一个xmlhttp对象池合理创建和使用xmlhttp对象
2010/01/15 Javascript
jquery实现的超出屏幕时把固定层变为定位层的代码
2010/02/23 Javascript
javascript 45种缓动效果 非常酷
2011/06/28 Javascript
JSONP 跨域共享信息
2012/08/16 Javascript
js实现点击左右按钮轮播图片效果实例
2015/01/29 Javascript
JS+CSS实现带有碰撞缓冲效果的竖向导航条代码
2015/09/15 Javascript
chrome调试javascript详解
2015/10/21 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
浏览器环境下JavaScript脚本加载与执行探析之defer与async特性
2016/01/14 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
2016/09/29 Javascript
关于AngularJs数据的本地存储详解
2017/01/20 Javascript
AngularJS中的promise用法分析
2017/05/19 Javascript
js循环map 获取所有的key和value的实现代码(json)
2018/05/09 Javascript
搭建基于express框架运行环境的方法步骤
2018/11/15 Javascript
layui checkbox默认选中,获取选中值,清空所有选中项的例子
2019/09/02 Javascript
js在HTML的三种引用方式详解
2020/08/29 Javascript
[01:43]3.19DOTA2发布会 三代刀塔人第三代
2014/03/25 DOTA
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
python实现K最近邻算法
2018/01/29 Python
python3+opencv3识别图片中的物体并截取的方法
2018/12/05 Python
基于python进行抽样分布描述及实践详解
2019/09/02 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
2019/10/14 Python
解决阿里云邮件发送不能使用25端口问题
2020/08/07 Python
Python通过字典映射函数实现switch
2020/11/06 Python
大学生活学习的自我评价
2013/12/03 职场文书
师德师风建设方案
2014/05/08 职场文书
人事任命通知
2015/04/20 职场文书
应收账款管理制度
2015/08/06 职场文书