我相信这会被标记为重复,但我真的不明白我在看什么。我已经检查过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不能这样做?
答案 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