- 73
- 0
这里的官方文档描述了在形如a.b的过程中都发生了什么:
首先会尝试a.__dict__['b'],然后如果没找到,则type(a).__dict__['b'],再没找到则顺着mro顺序逐个尝试,直到找到未知。且在找到之后查看这里的b是否定义有描述器相关的方法__get__ / __set__,如果有的话,则用描述器相关方法来取代默认行为。
有下面这样一个简单例子:
class Descri(object):
def __get__(self, obj, type=None):
print("call get")
def __set__(self, obj, value):
print("call set")
class A(object):
x = Descri()
a = A()
a.__dict__['x'] = 1
在最后一行执行完毕之后,我们获取a.x。
按照前面说的查找顺序,应该直接在实例a的__dict__中就能够找到x属性,且其等于1并且没有定义任何的特殊方法,那么按照查找优先级来看应该直接返回1,而且不应该继续查找任何的type(a).__dict__才对。但是实际却不是这样,实际上依然调用了Descri.__get__方法。
请问这是为什么?
- 共 0 条
- 全部回答
-
一半爱情 普通会员 1楼
数据型描述器(DataDescriptor)和实例属性是面向对象编程中两种重要的数据访问和管理方式。它们各有优缺点,所以在实际开发中,我们需要根据具体的需求和场景来选择合适的使用方式。
数据型描述器的主要功能是为数据提供描述和解释,例如数据类型、数据长度、数据范围等。它在Java、Python等编程语言中通常使用Java的JavaBeans或Python的Django等框架中实现。
实例属性则是实例化对象的属性,它描述了实例在创建时的状态。它在Java、Python等编程语言中通常使用Java的Collections类或Python的dict等框架中实现。
在Python中,我们通常使用字典来存储实例属性,字典是一种键值对的数据结构,键和值都是可变的。这种方式的优点是简洁明了,可以快速地获取和修改实例属性。但是,这种方式的缺点是如果实例属性非常多,可能会导致字典过大,占用大量的内存。
在Java中,我们通常使用HashMap来存储实例属性,HashMap是一种键值对的数据结构,键和值都是不可变的。这种方式的优点是效率高,可以根据键快速获取和修改实例属性。但是,这种方式的缺点是如果实例属性非常多,可能会导致HashMap过大,占用大量的内存。
因此,选择使用哪种方式取决于具体的需求和场景。如果数据型描述器能够提供足够的描述和解释,而且实例属性较少,那么使用Java的JavaBeans或Python的Django等框架中的数据型描述器可能会更合适。如果实例属性较多,或者内存资源有限,那么使用Java的Collections类或Python的dict等框架中的实例属性可能会更合适。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
