栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

描述符作为python中的实例属性

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

描述符作为python中的实例属性

只有在类而不是实例上定义时,大量高级功能才起作用。例如,所有特殊方法。除了使代码评估更有效之外,这还使实例和类型之间的分隔变得清晰,否则分隔将容易崩溃(因为所有类型都是对象)。

我不确定这是如何推荐的,但是您可以在实例中存储从描述符实例到属性值的映射:

class Prop(object):     def __get__(self, obj, objtype=None):        if obj is None: return self        return obj._value * obj._multiplier[self]    def __set__(self, obj, value):        if obj is None: return self        obj._value = valueclass Obj(object):    val = Prop()    def __init__(self):        self._value = 1        self._multiplier = {Obj.val: 0}

与其他两个建议的选项相比,它具有明显的优势:

  1. 每个实例的类破坏了面向对象并增加了内存使用;
  2. 覆盖
    __getattribute__
    是低效的(因为所有属性访问都必须通过覆盖的特殊方法进行访问)并且脆弱。

或者,您可以使用proxy属性:

class PerInstancePropertyProxy(object):    def __init__(self, prop):        self.prop = prop    def __get__(self, instance, owner):        if instance is None: return self        return instance.__dict__[self.prop].__get__(instance, owner)    def __set__(self, instance, value):        instance.__dict__[self.prop].__set__(instance, value)class Prop(object):    def __init__(self, value, multiplier):        self.value = value        self.multiplier = multiplier    def __get__(self, instance, owner):        if instance is None: return self        return self.value * self.multiplier    def __set__(self, instance, value):        self.value = valueclass Obj(object):    val = PerInstancePropertyProxy('val')    def __init__(self):        self.__dict__['val'] = Prop(1.0, 10.0)    def prop(self, attr_name):        return self.__dict__[attr_name]


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/636931.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号