descriptor example
from weakref import WeakKeyDictionary
class Positive(): def \_\_init(self): self._instance_data = WeakKeyDictionary()
def \_\_get\_\_(self, instance, owner_class): return self._instance_data[instance]
def \_\_set\_\_(self, instance, value): if value <=0: raise ValueError() self._instance_data[instance] = value
def \_\_delete\_\_(self, instance): raise AttributeError()
if descriptor called from a class
instance is None
non-data descriptor
only __get__ method
attribute lookup precedence
data descriptor,__dict__, non-data descriptor