浅谈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 相关文章推荐
详解Django通用视图中的函数包装
Jul 21 Python
Python实现控制台进度条功能
Jan 04 Python
Python实现KNN邻近算法
Jan 28 Python
快速解决PyCharm无法引用matplotlib的问题
May 24 Python
python复制列表时[:]和[::]之间有什么区别
Oct 16 Python
Python面向对象之类的定义与继承用法示例
Jan 14 Python
使用Python将Mysql的查询数据导出到文件的方法
Feb 25 Python
Python 循环终止语句的三种方法小结
Jun 24 Python
python利用re,bs4,requests模块获取股票数据
Jul 29 Python
python爬虫模块URL管理器模块用法解析
Feb 03 Python
TensorFlow2.0矩阵与向量的加减乘实例
Feb 07 Python
Python 中数组和数字相乘时的注意事项说明
May 10 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
Terran魔法科技
2020/03/14 星际争霸
PHP初学入门
2006/11/19 PHP
测试PHP连接MYSQL成功与否的代码
2013/08/16 PHP
php批量更改数据库表前缀实现方法
2013/10/26 PHP
php解析url的三个示例
2014/01/20 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
2016/01/07 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
2019/06/14 PHP
JS实现仿百度输入框自动匹配功能的示例代码
2014/02/19 Javascript
Jquery修改页面标题title其它JS失效的解决方法
2014/10/31 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
2016/05/21 Javascript
Javascript类型系统之undefined和null浅析
2016/07/13 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
2017/03/21 Javascript
详解用函数式编程对JavaScript进行断舍离
2017/09/18 Javascript
React Native时间转换格式工具类分享
2017/10/24 Javascript
Nodejs实现爬虫抓取数据实例解析
2018/07/05 NodeJs
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
[01:00:11]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第一场 2月7日
2021/03/11 DOTA
Python爬取京东的商品分类与链接
2016/08/26 Python
利用Python如何生成hash值示例详解
2017/12/20 Python
pytorch构建网络模型的4种方法
2018/04/13 Python
Pytorch实现将模型的所有参数的梯度清0
2020/06/24 Python
Python如何将将模块分割成多个文件
2020/08/04 Python
Python与C/C++的相互调用案例
2021/03/04 Python
浅谈HTML5新增和废弃的标签
2019/04/28 HTML / CSS
iRobot官网:改变生活的家用机器人品牌
2016/09/20 全球购物
印度购物网站:TATA CLiQ
2017/11/23 全球购物
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
澳大利亚拥有最好的家具和家居用品在线目的地:Nestz
2019/02/23 全球购物
药品促销活动方案
2014/02/14 职场文书
车辆委托书范本
2014/10/05 职场文书
2015年度房地产工作总结
2015/04/09 职场文书
英语教学课后反思
2016/02/15 职场文书
《别在吃苦的年纪选择安逸》读后感3篇
2019/11/30 职场文书