浅谈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中使用asyncio实现异步IO实例分析

    2021-02-06 10:02:50
  • javascript 版 Bad Apple 字符动画

    2010-01-28 12:19:00
  • Python使用read_csv读数据遇到分隔符问题的2种解决方式

    2022-01-13 13:30:47
  • 基于python2.7实现图形密码生成器的实例代码

    2021-01-21 15:20:50
  • Python中利用原始套接字进行网络编程的示例

    2023-06-22 18:02:03
  • AJAX实战实现级联选择

    2009-08-21 12:27:00
  • python实现zencart产品数据导入到magento(python导入数据)

    2022-06-04 12:34:32
  • 几款黑体的测试和介绍

    2008-07-18 17:09:00
  • 操作Dom节点实现间歇滚动新闻

    2009-10-16 20:51:00
  • Python利用for循环打印星号三角形的案例

    2022-09-20 22:22:00
  • python地震数据可视化详解

    2021-05-14 15:41:52
  • Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法

    2022-11-16 20:48:41
  • python 函数定位参数+关键字参数+inspect模块

    2023-07-05 23:04:37
  • 使用ACCESS做网络版程序的四种解决方案

    2009-01-14 16:22:00
  • 用Pytorch训练CNN(数据集MNIST,使用GPU的方法)

    2021-10-12 23:01:01
  • block 和 inline 答案揭晓~ 另付一则,关于 word-break

    2009-12-08 13:06:00
  • Python列表list内建函数用法实例分析【insert、remove、index、pop等】

    2022-01-13 10:18:24
  • 解决pytorch 模型复制的一些问题

    2022-04-23 03:57:58
  • Python闭包之返回函数的函数用法示例

    2022-12-09 18:50:41
  • ASP 连接mysql信息(strConnString)

    2009-10-29 12:02:00
  • asp之家 网络编程 m.aspxhome.com