浅谈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 pickle 和 shelve模块的用法
Sep 16 Python
Python中time模块与datetime模块在使用中的不同之处
Nov 24 Python
初探利用Python进行图文识别(OCR)
Feb 26 Python
Python这样操作能存储100多万行的xlsx文件
Apr 16 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
Aug 27 Python
python实现按关键字筛选日志文件
Dec 24 Python
python 绘制正态曲线的示例
Sep 24 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
Oct 22 Python
Python监听键盘和鼠标事件的示例代码
Nov 18 Python
python opencv角点检测连线功能的实现代码
Nov 24 Python
python 指定源路径来解决import问题的操作
Mar 04 Python
Python基础之函数嵌套知识总结
May 23 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函数)
2006/10/09 PHP
PHP4与PHP5的时间格式问题
2008/02/17 PHP
php实现文件下载简单示例(代码实现文件下载)
2014/03/10 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
使用 JScript 创建 .exe 或 .dll 文件的方法
2011/07/13 Javascript
js阻止冒泡及jquery阻止事件冒泡示例介绍
2013/11/19 Javascript
jQuery实现限制textarea文本框输入字符数量的方法
2015/05/28 Javascript
JavaScript实现LI列表数据绑定的方法
2015/08/04 Javascript
Java  Spring 事务回滚详解
2016/10/17 Javascript
强大的 Angular 表单验证功能详细介绍
2017/05/23 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
node.js中axios使用心得总结
2017/11/29 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
详解vue中点击空白处隐藏div的实现(用指令实现)
2018/04/19 Javascript
layui点击导航栏刷新tab页的示例代码
2018/08/14 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
2019/04/14 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
微信小程序分包加载代码实现方法详解
2019/09/23 Javascript
深入浅析vue全局环境变量和模式
2020/04/28 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
2020/09/08 Javascript
Python异步操作MySQL示例【使用aiomysql】
2019/05/16 Python
Python中调用其他程序的方式详解
2019/08/06 Python
python图形绘制奥运五环实例讲解
2019/09/14 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
python集合能干吗
2020/07/19 Python
CSS 3.0文字悬停跳动特效代码
2020/10/26 HTML / CSS
俄罗斯隐形眼镜和眼镜在线商店:Cronos
2020/06/02 全球购物
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
微观物理专业自荐信
2014/01/26 职场文书
护理学院专科毕业生求职信
2014/06/28 职场文书
暑期培训班招生方案
2014/08/26 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
教师先进个人材料
2014/12/17 职场文书
nodejs利用readline提示输入内容实例代码
2021/07/15 NodeJs
Nginx缓存设置案例详解
2021/09/15 Servers
Java 通过手写分布式雪花SnowFlake生成ID方法详解
2022/04/07 Java/Android