浅谈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 相关文章推荐
tornado框架blog模块分析与使用
Nov 21 Python
Python Tkinter简单布局实例教程
Sep 03 Python
python使用urllib2实现发送带cookie的请求
Apr 28 Python
Python实现栈的方法
May 26 Python
详解Python的Django框架中的模版相关知识
Jul 15 Python
sublime text 3配置使用python操作方法
Jun 11 Python
python中Matplotlib实现绘制3D图的示例代码
Sep 04 Python
python中ASCII码字符与int之间的转换方法
Jul 09 Python
Python3 读、写Excel文件的操作方法
Oct 20 Python
使用python实现画AR模型时序图
Nov 20 Python
利用Python计算KS的实例详解
Mar 03 Python
Python如何进行时间处理
Aug 06 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实现可用于mysql,mssql,pg数据库操作类
2014/12/13 PHP
PHP远程调试之XDEBUG
2015/12/29 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
纯JavaScript实现的完美渐变弹出层效果代码
2010/04/02 Javascript
TextArea设置MaxLength属性最大输入值的js代码
2012/12/21 Javascript
js原型继承的两种方法对比介绍
2014/03/30 Javascript
使用npm发布Node.JS程序包教程
2015/03/02 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
jQuery控制Div拖拽效果完整实例分析
2015/04/15 Javascript
js如何实现点击标签文字,文字在文本框出现
2015/08/05 Javascript
Bootstrap的图片轮播示例代码
2015/08/31 Javascript
jQuery对checkbox 复选框的全选全不选反选的操作
2016/08/09 Javascript
原生JS实现图片网格式渐显、渐隐效果
2017/06/05 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
2017/07/06 Javascript
详解vue-cli中的ESlint配置文件eslintrc.js
2017/09/25 Javascript
JS实现中文汉字按拼音排序的方法
2017/10/09 Javascript
在vue.js中使用JSZip实现在前端解压文件的方法
2018/09/05 Javascript
JS实现的小火箭发射动画效果示例
2018/12/08 Javascript
vue-cli3环境变量与分环境打包的方法示例
2019/02/18 Javascript
NodeJS读取分析Nginx错误日志的方法
2019/05/14 NodeJs
vue-router两种模式区别及使用注意事项详解
2019/08/01 Javascript
[04:02]DOTA2上海特锦赛小组赛第二日recap精彩回顾
2016/02/28 DOTA
在PYQT5中QscrollArea(滚动条)的使用方法
2019/06/14 Python
基于Python实现船舶的MMSI的获取(推荐)
2019/10/21 Python
基于python实现百度语音识别和图灵对话
2020/11/02 Python
CSS教程:CSS3圆角属性
2009/04/02 HTML / CSS
浅析CSS3 中的 transition,transform,translate之间区别和作用
2020/03/26 HTML / CSS
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
法人单位授权委托书范文
2014/10/06 职场文书
嘉宾邀请函
2015/01/31 职场文书
运动会广播稿100字
2015/08/19 职场文书
2019年员工晋升管理制度范本!
2019/07/08 职场文书
2019年市场部个人述职报告(三篇)
2019/10/23 职场文书
golang 实用库gotable的具体使用
2021/07/01 Golang
Tomcat弱口令复现及利用
2022/05/06 Servers