您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

5b51 2022/1/14 8:16:14 python 字数 5243 阅读 306 来源 www.jb51.cc/python

关于__dict__和dir()的区别和作用请参考这篇文章: 基于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中的*重复运算符等,如有不足之处,欢迎留言指出。

总结

以上是编程之家为你收集整理的浅谈Python由__dict__和dir()引发的一些思考全部内容,希望文章能够帮你解决浅谈Python由__dict__和dir()引发的一些思考所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶