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

 更新时间:2017年10月30日 09:59:14   作者:雷子-LL  
这篇文章主要介绍了浅谈Python由__dict__和dir()引发的一些思考,具有一定参考价值,需要的朋友可以了解下。

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

总结

以上就是本文关于浅谈Python由__dict__和dir()引发的一些思考的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:浅谈使用Python变量时要避免的3个错误深入理解Python中的*重复运算符等,如有不足之处,欢迎留言指出。

相关文章

  • pychram中切换python版本方式(附图文)

    pychram中切换python版本方式(附图文)

    这篇文章主要介绍了如何在PyCharm中切换Python版本的步骤,包括查看现有版本、文件设置切换、选择解释器路径以及应用更改,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-12-12
  • python 实现查找文件并输出满足某一条件的数据项方法

    python 实现查找文件并输出满足某一条件的数据项方法

    今天小编就为大家分享一篇python 实现查找文件并输出满足某一条件的数据项方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • 在python中实现将一张图片剪切成四份的方法

    在python中实现将一张图片剪切成四份的方法

    今天小编就为大家分享一篇在python中实现将一张图片剪切成四份的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • python实现控制COM口的示例

    python实现控制COM口的示例

    今天小编就为大家分享一篇python实现控制COM口的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • python Xpath语法的使用

    python Xpath语法的使用

    这篇文章主要介绍了python Xpath语法的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 安装pyhttpx解决ImportError: DLL load failed错误

    安装pyhttpx解决ImportError: DLL load failed错误

    这篇文章主要为大家介绍了安装pyhttpx解决ImportError: DLL load failed错误,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Python编程itertools模块处理可迭代集合相关函数

    Python编程itertools模块处理可迭代集合相关函数

    本篇博客将为你介绍Python函数式编程itertools模块中处理可迭代集合的相关函数,有需要的朋友可以借鉴参考下,希望可以有所帮助
    2021-09-09
  • Python Matplotlib数据可视化模块使用详解

    Python Matplotlib数据可视化模块使用详解

    matplotlib是基建立在python之上,适用于创建静态,动画和交互式可视化,通常与数据分析模块pandas搭配使用,用于数据的分析和展示,适用于主流的操作系统,如Linux、Win、Mac
    2022-11-11
  • python 字典item与iteritems的区别详解

    python 字典item与iteritems的区别详解

    这篇文章主要介绍了python 字典item与iteritems的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • python Stanza处理NLP任务使用详解(多语言处理工具)

    python Stanza处理NLP任务使用详解(多语言处理工具)

    这篇文章主要为大家介绍了python Stanza处理NLP任务使用详解,多语言处理工具使用实例探索,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01

最新评论