浅谈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 相关文章推荐
win7安装python生成随机数代码分享
Dec 27 Python
python数组复制拷贝的实现方法
Jun 09 Python
python实现根据主机名字获得所有ip地址的方法
Jun 28 Python
使用python 爬虫抓站的一些技巧总结
Jan 10 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
Apr 28 Python
Python3.5装饰器原理及应用实例详解
Apr 30 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
Jul 25 Python
Python函数的默认参数设计示例详解
Dec 01 Python
Python中zip函数如何使用
Jun 04 Python
Python定时任务APScheduler安装及使用解析
Aug 07 Python
python3中布局背景颜色代码分析
Dec 01 Python
python装饰器代码深入讲解
Mar 01 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获取指定日期之间的各个周和月的起止时间
2014/11/24 PHP
php生成gif动画的方法
2015/11/05 PHP
PHP的消息通信机制测试实例
2016/11/10 PHP
php 中htmlentities导致中文无法查询问题
2018/09/10 PHP
用js实现上传图片前的预览(TX的面试题)
2007/08/14 Javascript
Javascript 强制类型转换函数
2009/05/17 Javascript
jQuery的.live()和.die() 使用介绍
2011/09/10 Javascript
javaScript复制功能调用实现方案
2012/12/13 Javascript
仿新浪微博登陆邮箱提示效果的js代码
2013/08/02 Javascript
jquery操作select大全
2014/04/25 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
JavaScript通过事件代理高亮显示表格行的方法
2015/05/27 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
深入浅析JavaScript中的arguments对象(强力推荐)
2016/06/03 Javascript
jQuery3.0中的buildFragment私有函数详解
2016/08/16 Javascript
基于Vue制作组织架构树组件
2017/12/06 Javascript
React如何解决fetch跨域请求时session失效问题
2018/11/02 Javascript
JS中的一些常用的函数式编程术语
2019/06/15 Javascript
vuex + keep-alive实现tab标签页面缓存功能
2019/10/17 Javascript
bootstrap实现tab选项卡切换
2020/08/09 Javascript
ES6中的Javascript解构的实现
2020/10/30 Javascript
[37:35]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第二局
2016/02/25 DOTA
Python中super()函数简介及用法分享
2016/07/11 Python
深入理解NumPy简明教程---数组1
2016/12/17 Python
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
python实现Zabbix-API监控
2018/09/17 Python
Python爬虫学习之翻译小程序
2019/07/30 Python
windows10在visual studio2019下配置使用openCV4.3.0
2020/07/14 Python
2021年值得向Python开发者推荐的VS Code扩展插件
2021/01/25 Python
萌新HTML5 入门指南(二)
2020/11/09 HTML / CSS
基层党员对照检查材料
2014/08/25 职场文书
2014年最新个人对照检查材料范文
2014/09/25 职场文书
闪闪红星观后感
2015/06/08 职场文书
团队执行力培训心得体会
2015/08/15 职场文书
2016年青少年禁毒宣传教育活动总结(学校)
2016/04/05 职场文书
如何在Python项目中引入日志
2021/05/31 Python