浅谈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编写Linux系统守护进程实例
Feb 03 Python
Python的Django框架安装全攻略
Jul 15 Python
浅谈Python数据类型判断及列表脚本操作
Nov 04 Python
Python xlwt设置excel单元格字体及格式
Apr 18 Python
python实现csv格式文件转为asc格式文件的方法
Mar 23 Python
python解压TAR文件至指定文件夹的实例
Jun 10 Python
python 字典套字典或列表的示例
Dec 16 Python
Python调用scp向服务器上传文件示例
Dec 22 Python
tensorflow指定CPU与GPU运算的方法实现
Apr 21 Python
Python的历史与优缺点整理
May 26 Python
详解Python中的文件操作
Jan 14 Python
基于注解实现 SpringBoot 接口防刷的方法
Mar 02 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中计算字符串相似度的函数代码
2012/12/29 PHP
详解PHP中curl_multi并发的实现
2020/06/08 PHP
javascript html 静态页面传参数
2009/04/10 Javascript
Javascript this 的一些学习总结
2012/08/02 Javascript
js 赋值包含单引号双引号问题的解决方法
2014/02/26 Javascript
PHP实现的各种中文编码转换类分享
2015/01/23 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
全面解析Javascript无限添加QQ好友原理
2016/06/15 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
2016/07/19 Javascript
jQuery.form.js的使用详解
2017/06/14 jQuery
对Vue.js之事件的绑定(v-on: 或者 @ )详解
2018/09/15 Javascript
Vue项目报错:Uncaught SyntaxError: Unexpected token
2018/11/10 Javascript
vue实现在进行增删改操作后刷新页面
2020/08/05 Javascript
微信小程序基于高德地图API实现天气组件(动态效果)
2020/10/22 Javascript
简单介绍Python中的len()函数的使用
2015/04/07 Python
对于Python的框架中一些会话程序的管理
2015/04/20 Python
Python中的map()函数和reduce()函数的用法
2015/04/27 Python
Python脚本处理空格的方法
2016/08/08 Python
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
pyqt 多窗口之间的相互调用方法
2019/06/19 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
2019/08/04 Python
对Django 转发和重定向的实例详解
2019/08/06 Python
为什么称python为胶水语言
2020/06/16 Python
详解利用css3的var()实现运行时改变scss的变量值
2021/03/02 HTML / CSS
input file上传文件样式支持html5的浏览器解决方案
2012/11/14 HTML / CSS
蒂娜商店:Tiina the Store
2019/12/07 全球购物
如何用Lucene索引数据库
2016/02/23 面试题
string = null 和string = ''的区别
2013/04/28 面试题
什么是封装
2013/03/26 面试题
宣传普通话标语
2014/06/27 职场文书
2015年安全保卫工作总结
2015/05/14 职场文书
2015小学毕业班工作总结
2015/07/21 职场文书
SQL Server基本使用和简单的CRUD操作
2021/04/05 SQL Server
Python爬虫 简单介绍一下Xpath及使用
2022/04/26 Python
图神经网络GNN算法
2022/05/11 Python