Python属性访问背后的魔法
Python属性访问背后的魔法,这里一字不差地引用了ShalabhChatuvedi的书中的内容,流程如下:
1.如果attrname是一个objectname的特殊(例如,Python提供的)属性,返回它;
2.检查objectname.__class__.__dict__中的attrname。如果它存在并且是一个数据描述符,返回这个描述符本身。搜索所有objectname.__class__的基类并做相同的操作;
3.检查objectname.__dict__中的attrname,如果找到即返回。如果objectname是一个类,同时搜索它的基类。如果它是类并且一个描述符存在其中或是基类中,返回这个描述符的结果;
4.检查objectname.__class__.__dict__中的attrname。如果存在并且是一个非数据描述符,返回这个描述符的结果。如果存在并且不是一个描述符,直接返回。如果是存在并且是一个数据描述符,我们不应当来这里因为我们应当已经在第二步时返回了。搜索所有的objectname.__class__的基类并做同样的操作。
5.抛出AttributeError异常。
为了更好的说明,这里有一些使用我们在描述符一节所写的代码(请再看一遍以便有个更清醒的认识)所做的测试:
data_attr_child是some_object类中的一个描述符。所以你可以重写它。同样,ChildClass(‘desc3’)中的version已经使用了,不是ParentClass中的那一个。
注意到当你使用一些非数据描述符(或者在本例中类似字符串的一些对象)替代类中的数据描述符时,我们最初在some_object的__dict__中添加的条目开始起作用了。因此,some_object.data_attr_child返回’xyz’,而不是’abc’。
data_attr_parent的属性行为和data_attr_child的类似。
注意到你不能在ChildClass中重写data_attr_parent。一旦你这么做了,我们将穿过规则1-2-3并在规则4停下,最终得到结果’xyz’。
设置属性的规则
这里要比获得属性的规则简单许多。在此引用Shalabh的书:
1.检查objectname.__class__.__dict__中的attrname属性。如果存在并且是一个数据描述符,使用描述符来设置值。搜索所有objectname.__class__的基类并做相同的操作。
2.向objectname.__dict__的attrname键插入一些内容。
就是这些!。
__slots__
简单得说,__slots__是Python中阻止对象拥有它自己的__dict__属性的方式。这意味着,如果你在类里定义了__slots__,你就不可以给它的对象设置任意属性(除了在’slots’中定义的)。
但是这时,记住你是在SomeClass的__dict__中定义的z,而不是在obj中。
正如GuidovanRossum他自己在他的博客中所提到的,Python的__slots__实现是为了带来效率的提升,而不是严格限制属性设置。直观地说:假设你有一个类,你想要构造大规模的它的对象。你不希望对象本身拥有灵活的动态的属性,而是想要更高的效率。由于slots本质上去掉了每个对象的__dict__属性,这样你会节省大量的内存。
有趣的是,Python中slots是由描述符实现的。
Python培训、Python培训班、Python培训机构,就选光环大数据!
还不够过瘾?想学习更多?点击 http://hadoop.aura.cn/python/ 进行Python学习!
大数据培训、人工智能培训、Python培训、大数据培训机构、大数据培训班、数据分析培训、大数据可视化培训,就选光环大数据!光环大数据,聘请专业的大数据领域知名讲师,确保教学的整体质量与教学水准。讲师团及时掌握时代潮流技术,将前沿技能融入教学中,确保学生所学知识顺应时代所需。通过深入浅出、通俗易懂的教学方式,指导学生更快的掌握技能知识,成就上万个高薪就业学子。 更多问题咨询,欢迎点击------>>>>在线客服!