浅谈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发送邮件接收邮件示例分享
Jan 21 Python
Python深入学习之上下文管理器
Aug 31 Python
Python中使用Flask、MongoDB搭建简易图片服务器
Feb 04 Python
python使用paramiko实现远程拷贝文件的方法
Apr 18 Python
python读取与写入csv格式文件的示例代码
Dec 16 Python
微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧
Jan 04 Python
Java编程迭代地删除文件夹及其下的所有文件实例
Feb 10 Python
在python中使用requests 模拟浏览器发送请求数据的方法
Dec 26 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
Jan 05 Python
python计算auc的方法
Sep 09 Python
Pycharm自动添加文件头注释和函数注释参数的方法
Oct 23 Python
利用Python如何画一颗心、小人发射爱心
Feb 21 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
session在PHP大型web应用中的使用
2011/06/25 PHP
php实现建立多层级目录的方法
2014/07/19 PHP
php从字符串创建函数的方法
2015/03/16 PHP
Apache启动报错No space left on device: AH00023该怎么解决
2015/10/16 PHP
js 时间函数应用加、减、比较、格式转换的示例代码
2013/08/23 Javascript
JavaScript中获取样式的原生方法小结
2014/10/08 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
浅谈Javascript实现继承的方法
2015/07/06 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
2015/12/04 Javascript
jQuery实现的分子运动小球碰撞效果
2016/01/27 Javascript
百度地图给map添加右键菜单(判断是否为marker)
2016/03/04 Javascript
如何判断Javascript对象是否存在的简单实例
2016/05/18 Javascript
js实现楼层效果的简单实例
2016/07/15 Javascript
Angularjs的Controller间通信机制实例分析
2016/11/07 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
Python中getattr函数和hasattr函数作用详解
2016/06/14 Python
Python中shape计算矩阵的方法示例
2017/04/21 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
Python 获取ftp服务器文件时间的方法
2019/07/02 Python
使用coverage统计python web项目代码覆盖率的方法详解
2019/08/05 Python
Django为窗体加上防机器人的验证码功能过程解析
2019/08/14 Python
详解Python利用random生成一个列表内的随机数
2019/08/21 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
2020/02/29 Python
如何理解Python中的变量
2020/06/01 Python
css3如何绘制一个圆圆的loading转圈动画
2018/01/09 HTML / CSS
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
英国购买威士忌网站:Master of Malt
2019/09/26 全球购物
如何在Cookie里面保存Unicode和国际化字符
2013/05/25 面试题
毕业留言寄语大全
2014/04/10 职场文书
银行授权委托书格式
2014/10/10 职场文书
铁人纪念馆观后感
2015/06/16 职场文书
大学生社区义工服务心得体会
2016/01/22 职场文书
幼儿园2016圣诞节活动总结
2016/03/31 职场文书
学会Python数据可视化必须尝试这7个库
2021/06/16 Python
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
2021/07/07 Servers