3

我正在使用的一个 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,obj,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)

输出是这样的,最后一次调用设置了两个对象的值:

localhost $ python descriptor_testing.py 
sally
sally
4

1 回答 1

7

只有一个描述符对象,存储在类对象上,所以self总是相同的。如果要存储每个对象的数据并通过描述符访问它,则必须将数据存储在每个对象上(可能是更好的主意)或存储在每个对象键入的某些数据结构中(我不喜欢的想法尽可能多)。

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

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

    def __get__(self,obj,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,obj,val):
        obj.__dict__[self.name] = val
        # alternatively the following; but won't work with shadowing:
        #setattr(obj, self.name, val)

    def __delete__(self,obj):
        pass


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

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

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

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

MyClass().varx

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

MyClass().__dict__['varx']

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

于 2009-12-16T16:11:00.117 回答