浅谈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批量修改文件后缀的方法
Jan 26 Python
总结Python编程中三条常用的技巧
May 11 Python
Python实现通过继承覆盖方法示例
Jul 02 Python
Python常见排序操作示例【字典、列表、指定元素等】
Aug 15 Python
对python中Librosa的mfcc步骤详解
Jan 09 Python
Django中Middleware中的函数详解
Jul 18 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
Dec 23 Python
Python Django中的STATIC_URL 设置和使用方式
Mar 27 Python
python实现在线翻译
Jun 18 Python
python对一个数向上取整的实例方法
Jun 18 Python
python多线程semaphore实现线程数控制的示例
Aug 10 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
Sep 16 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
DISCUZ 论坛管理员密码忘记的解决方法
2009/05/14 PHP
比较好用的PHP防注入漏洞过滤函数代码
2012/04/11 PHP
java微信开发之上传下载多媒体文件
2016/06/24 PHP
php添加数据到xml文件的简单例子
2016/09/08 PHP
jquery实现文本框鼠标右击无效以及不能输入的代码
2010/11/05 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
checkbox选中与未选中判断示例
2014/08/04 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
谈谈JavaScript异步函数发展历程
2015/09/29 Javascript
AngularJS自动表单验证
2016/02/01 Javascript
js移动焦点到最后位置的简单方法
2016/11/25 Javascript
利用n 升级工具升级Node.js版本及在mac环境下的坑
2017/02/15 Javascript
详细讲解vue2+vuex+axios
2017/05/27 Javascript
webpack+vue中使用别名路径引用静态图片地址
2017/11/20 Javascript
Next.js项目实战踩坑指南(笔记)
2018/11/29 Javascript
elementUI中Table表格问题的解决方法
2018/12/04 Javascript
JavaScript中Dom操作实例详解
2019/07/08 Javascript
微信小程序实现轨迹回放的示例代码
2019/12/13 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
微信小程序实现购物车功能
2020/11/18 Javascript
[02:44]重置世界,颠覆未来——DOTA2 7.23版本震撼上线
2019/12/01 DOTA
栈和队列数据结构的基本概念及其相关的Python实现
2015/08/24 Python
Python爬取三国演义的实现方法
2016/09/12 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
python批量获取html内body内容的实例
2019/01/02 Python
对python借助百度云API对评论进行观点抽取的方法详解
2019/02/21 Python
python opencv将表格图片按照表格框线分割和识别
2019/10/30 Python
python中使用you-get库批量在线下载bilibili视频的教程
2020/03/10 Python
Tensorflow实现将标签变为one-hot形式
2020/05/22 Python
Django-celery-beat动态添加周期性任务实现过程解析
2020/11/26 Python
解决Pymongo insert时会自动添加_id的问题
2020/12/05 Python
python 统计list中各个元素出现的次数的几种方法
2021/02/20 Python
Madda Fella官网:美国冒险家服装品牌
2020/01/16 全球购物
群众路线党员个人剖析材料
2014/10/08 职场文书
自主招生自荐信怎么写
2015/03/24 职场文书
MyBatis XPathParser解析器使用范例详解
2022/07/15 Java/Android