浅谈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 字符串格式化代码
Mar 17 Python
python实现分析apache和nginx日志文件并输出访客ip列表的方法
Apr 04 Python
Python实现的异步代理爬虫及代理池
Mar 17 Python
Python读csv文件去掉一列后再写入新的文件实例
Dec 28 Python
python正则实现提取电话功能
Feb 24 Python
python如何实现一个刷网页小程序
Nov 27 Python
django使用LDAP验证的方法示例
Dec 10 Python
Python代码打开本地.mp4格式文件的方法
Jan 03 Python
django创建简单的页面响应实例教程
Sep 06 Python
python 用户交互输入input的4种用法详解
Sep 24 Python
Python字符编码转码之GBK,UTF8互转
Feb 09 Python
8种常用的Python工具
Aug 05 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中计算时间差的几种方法
2009/12/31 PHP
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
2017/06/20 PHP
PHP基于array_unique实现二维数组去重
2020/07/14 PHP
Ajax::prototype 源码解读
2007/01/22 Javascript
Javascript模板技术
2007/04/27 Javascript
复制小说文本时出现的随机乱码的去除方法
2010/09/07 Javascript
深入理解Javascript中this的作用域
2014/08/12 Javascript
jQuery插件开发汇总
2016/05/15 Javascript
JS求解三元一次方程组值的方法
2017/01/03 Javascript
jQuery实现动态生成表格并为行绑定单击变色动作的方法
2017/04/17 jQuery
AngularJS实现controller控制器间共享数据的方法示例
2017/10/30 Javascript
10行代码实现微信小程序滑动tab切换
2018/12/28 Javascript
vue+elementUI实现表格关键字筛选高亮
2020/10/26 Javascript
微信小程序class封装http代码实例
2019/08/24 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
2020/04/23 Javascript
基于Vue CSR的微前端实现方案实践
2020/05/27 Javascript
vue - props 声明数组和对象操作
2020/07/30 Javascript
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
Python单链表简单实现代码
2016/04/27 Python
python实现跨excel的工作表sheet之间的复制方法
2018/05/03 Python
Tensorflow使用tfrecord输入数据格式
2018/06/19 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
2019/08/12 Python
Python input函数使用实例解析
2019/11/22 Python
Python3 把一个列表按指定数目分成多个列表的方式
2019/12/25 Python
python的slice notation的特殊用法详解
2019/12/27 Python
深入理解Python 多线程
2020/06/16 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
2020/12/04 Python
String是最基本的数据类型吗?
2013/06/13 面试题
十佳大学生村官事迹
2014/01/09 职场文书
安全承诺书格式
2014/05/21 职场文书
党支部创先争优承诺书
2014/08/30 职场文书
2015年度员工自我评价范文
2015/03/11 职场文书
2016春季运动会开幕词
2016/03/04 职场文书
Django展示可视化图表的多种方式
2021/04/08 Python
python爬取豆瓣电影TOP250数据
2021/05/23 Python
用Python创建简易网站图文教程
2021/06/11 Python