浅谈Python由__dict__和dir()引发的一些思考

作者:雷子-LL 时间:2021-10-06 06:14:10 

关于__dict__和dir()的区别和作用请参考这篇文章:

基于Python __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参数就实现了实例和方法的绑定.

来源:http://www.cnblogs.com/thunderLL/p/7750785.html

标签:python,dict,dir
0
投稿

猜你喜欢

  • Python 绘图库 Matplotlib 入门教程

    2021-07-21 00:22:07
  • 不通过数据源名DSN也能访问Access数据库吗?

    2009-10-29 12:22:00
  • python根据文件名批量搜索文件

    2021-06-21 12:25:01
  • CSS代码实现下划线样式的输入框效果

    2010-03-16 12:42:00
  • python定时任务apscheduler的详细使用教程

    2023-03-30 07:48:05
  • vue打包之后生成一个配置文件修改接口的方法

    2024-05-29 22:45:27
  • Ubuntu安装MySQL5.7并配置数据存储路径的方法步骤

    2024-01-16 04:08:19
  • SQL行号排序和分页(SQL查询中插入行号 自定义分页的另类实现)

    2012-07-21 14:45:15
  • Go如何优雅的使用字节池示例详解

    2024-02-10 21:10:17
  • 如何理解python对象

    2022-09-04 06:58:54
  • Node.js下向MySQL数据库插入批量数据的方法

    2024-01-23 20:21:57
  • MySQL中使用表别名与字段别名的基本教程

    2024-01-12 19:39:15
  • Web2.0视觉风格进化论 之一

    2007-11-03 19:58:00
  • 基于vue打包后字体和图片资源失效问题的解决方法

    2024-05-05 09:12:13
  • TF-IDF算法解析与Python实现方法详解

    2021-12-28 02:38:47
  • Go语言驱动低代码应用引擎工具Yao开发管理系统

    2024-04-30 09:56:59
  • Python如何将函数值赋给变量

    2022-01-01 22:58:22
  • JSP实现用户登录、注册和退出功能

    2024-03-18 10:13:43
  • 返回首页的链接地址写法

    2008-10-22 13:38:00
  • python实现将excel文件转化成CSV格式

    2021-10-16 05:23:50
  • asp之家 网络编程 m.aspxhome.com