浅谈Python由__dict__和dir()引发的一些思考
2017-10-30 09:59
609 查看
关于__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中的*重复运算符等,如有不足之处,欢迎留言指出。
您可能感兴趣的文章:
相关文章推荐
- 黑马程序员_关于JAVA中栈和堆,以及由此引发的一些思考
- python dict 字典 以及 赋值 引用的一些小实验
- 读《我们的改革是不是正走向一个反面:谁抛弃了中国?》引发的一些另一个角度的思考
- 如何在PHP中保持SESSION以及由此引发的一些思考
- 关于==和equals引发的一些思考
- Python-用filter()删除1~100的素数和一些思考
- PHP保持SESSION问题以及由SESSION性能引发的一些思考
- Sql Server之旅——终点站 nolock引发的三级事件的一些思考
- Python之dir()与__dict__的区别
- 关于“JAVA中为什么没有了多继承并出现了接口”这一问题引发的一些思考
- Python 实现单例模式的一些思考
- python基础-dir()和__dict__
- Python中dict与dir()
- 浅谈python配置与使用OpenCV踩的一些坑
- 由 '' in 'abc' return True 引发的思考----Python 成员测试操作
- python中的dir()和__dict__
- 由循环次数设定引发的一些思考
- Python之dir()与__dict__的区别
- 开车误闯红灯的补救方法 (以及由此引发的一些思考)
- String 引发的一些思考