账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    关于数据型描述器(data descriptor)与实例属性的优先级问题
    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
    打赏
    收藏
    点击回答
        全部回答
    • 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等框架中的实例属性可能会更合适。

    更多回答
    网站公告
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部