加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python描述符跨类共享值

发布时间:2020-12-20 11:12:18 所属栏目:Python 来源:网络整理
导读:我正在使用的 python描述符是在其所有者类的所有实例之间共享其值.如何使每个实例的描述符包含其自己的内部值? class Desc(object): def __init__(self,initval=None,name='val'): self.val = initval self.name = name def __get__(self,obj,objtype): ret
我正在使用的 python描述符是在其所有者类的所有实例之间共享其值.如何使每个实例的描述符包含其自己的内部值?

class Desc(object):
    def __init__(self,initval=None,name='val'):
        self.val = initval
        self.name = name

    def __get__(self,obj,objtype):
        return self.val

    def __set__(self,val):
        self.val = val

    def __delete__(self,obj):
        pass


class MyClass(object):
    desc = Desc(10,'varx')

if __name__ == "__main__":
    c = MyClass()
    c.desc = 'max'
    d = MyClass()
    d.desc = 'sally'

    print(c.desc)
    print(d.desc)

输出为this,最后一次调用设置两个对象的值:

localhost $python descriptor_testing.py 
sally
sally

解决方法

存在于类对象上的只有一个描述符对象,因此self始终是相同的.如果你想存储每个对象的数据并通过描述符访问它,你要么必须将数据存储在每个对象上(可能是更好的想法),要么存储在每个对象键入的一些数据结构中(我不喜欢这个想法)尽可能多).

我会在实例对象上保存数据:

class Desc(object):
    default_value = 10
    def __init__(self,name):
        self.name = name

    def __get__(self,objtype):
        return obj.__dict__.get(self.name,self.default_value)
        # alternatively the following; but won't work with shadowing:
        #return getattr(obj,self.name,self.default_value)

    def __set__(self,val):
        obj.__dict__[self.name] = val
        # alternatively the following; but won't work with shadowing:
        #setattr(obj,val)

    def __delete__(self,obj):
        pass


class MyClass(object):
    desc = Desc('varx')

在这种情况下,数据将存储在其__dict__中的obj’varx’条目中.由于数据描述符查找的工作原理,您可以使用描述符“隐藏”存储位置:

class MyClass(object):
    varx = Desc('varx')

在这种情况下,当您执行查找时:

MyClass().varx

描述符对象被调用并且可以进行查找,但是当查找如下:

MyClass().__dict__['varx']

该值直接返回.因此,描述符能够将其数据存储在“隐藏”的位置,可以这么说.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读