浅谈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中装饰器的使用
Jul 12 Python
在win和Linux系统中python命令行运行的不同
Jul 03 Python
Python基于回溯法子集树模板解决找零问题示例
Sep 11 Python
深入浅析python with语句简介
Apr 11 Python
Linux下python3.6.1环境配置教程
Sep 26 Python
Python Flask 搭建微信小程序后台详解
May 06 Python
python 利用turtle库绘制笑脸和哭脸的例子
Nov 23 Python
基于python3实现倒叙字符串
Feb 18 Python
Python关于反射的实例代码分享
Feb 20 Python
在Keras中实现保存和加载权重及模型结构
Jun 15 Python
Python map及filter函数使用方法解析
Aug 06 Python
python numpy中setdiff1d的用法说明
Apr 22 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实现通用alert函数的方法
2015/03/11 PHP
PHP 绘制网站登录首页图片验证码
2016/04/12 PHP
给artDialog 5.02 增加ajax get功能详细介绍
2012/11/13 Javascript
设为首页加入收藏兼容360/火狐/谷歌/IE等主流浏览器的代码
2013/03/26 Javascript
js模拟select下拉菜单控件的代码
2013/05/08 Javascript
js单例模式的两种方案
2013/10/22 Javascript
JavaScript版的TwoQueues缓存模型
2014/12/29 Javascript
jquery实现根据浏览器窗口大小自动缩放图片的方法
2015/07/17 Javascript
vue.js学习笔记之绑定style样式和class列表
2016/10/31 Javascript
使用Promise链式调用解决多个异步回调的问题
2017/01/15 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
2020/07/22 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
2020/11/18 jQuery
[02:57]DOTA2亚洲邀请赛 SECRET战队出场宣传片
2015/02/07 DOTA
[43:32]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
[00:37]食人魔魔法师轮盘吉兆顺应全新至宝将拥有额外款式
2019/12/19 DOTA
python创建和删除目录的方法
2015/04/29 Python
在centos7中分布式部署pyspider
2017/05/03 Python
Python中with及contextlib的用法详解
2017/06/08 Python
SVM基本概念及Python实现代码
2017/12/27 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
2019/08/06 Python
基于打开pycharm有带图片md文件卡死问题的解决
2020/04/24 Python
pandas to_excel 添加颜色操作
2020/07/14 Python
利用python制作拼图小游戏的全过程
2020/12/04 Python
python基于爬虫+django,打造个性化API接口
2021/01/21 Python
HTML5中实现拖放效果无须借助javascript
2012/12/26 HTML / CSS
毕业生的自我鉴定
2013/10/29 职场文书
交通事故委托书范本精选
2014/10/04 职场文书
2014年酒店前台工作总结
2014/11/14 职场文书
年度考核表个人总结
2015/03/06 职场文书
行政上诉状范文
2015/05/23 职场文书
公司借条范本
2015/05/25 职场文书
家长对孩子的寒假评语
2015/10/09 职场文书
关于社会实践的心得体会(2016最新版)
2016/01/25 职场文书
国产动画《万圣街》日语配音版制作决定!
2022/03/20 国漫
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server
Python用any()函数检查字符串中的字母以及如何使用all()函数
2022/04/14 Python