Python描述符__get__和__set__

时间:2013-11-08 02:54:58

标签: python get set descriptor

我相信这会被标记为重复,但我真的不明白我在看什么。我已经检查过Descriptors上的python文档,但是我已经在Python中“编程”了两个星期了,我真的不知道我在找什么!

这就是我得到的:

>>> class Blub(object):
...     def __init__(self, value):
...             print('Blub is ' + value)
...             self.value = value
...     def __get__(self):
...             print('Blub gets ' + self.value)
...             return self.value
...     def __set__(self, value):
...             print('Blub becomes ' + value)
...             self.value = value
...
>>> class Quish(object):
...     def __init__(self, value):
...             self.blub = Blub(value)
...     def __get__(self):
...             return self.blub
...     def __set__(self, value):
...             self.blub = Blub(value)
... 

以下是我想要发生的事情,不知道该怎么做:

>>> a = Quish('One')
Blub is One
>>> a.blub
Blub gets One
'One'
a.blub = 'Two'
Blub becomes Two

我在Blub或Quish做什么才能实现这一目标。我在这里有非常简单的类,但是我有一个更复杂的版本,它可以很好地工作,但只有当我键入:

>>> a.blub.__get__()

我认为这些描述符的重点是不必实际编写 get ()和 set ()。我如何使其表现得像我想的那样,或者Python不能这样做?

1 个答案:

答案 0 :(得分:2)

通常你不直接使用描述符,而是使用property,它是一种易于使用的描述符实现。以下是您使用它的方式:

class Quish(object):
    def __init__(self, value):
        self.blub = value

    @property
    def blub(self):
        print('Blub gets ' + self._blub)
        return self._blub

    @blub.setter
    def blub(self, value):
        print('Blub becomes ' + value)
        self._blub = value

如果你真的想编写自己的描述符,你的问题是它需要直接在类型上设置,而不是作为另一个实例属性,并且你需要处理一个描述符多个实例:

class Blub(object):
    def __get__(self, instance, owner):
        print('Blub gets ' + instance._blub)
        return instance._blub

    def __set__(self, instance, value):
        print('Blub becomes ' + value)
        instance._blub = value


class Quish(object):
    blub = Blub()

    def __init__(self, value):
        self.blub = value