Understanding __get__ and __set__ and Python descriptors

python, python-descriptors

Solution

The descriptor is how Python's `property` type is implemented. A descriptor simply implements `__get__`, `__set__`, etc. and is then added to another class in its definition (as you did above with the Temperature class). For example:

temp=Temperature()
temp.celsius #calls celsius.__get__

Accessing the property you assigned the descriptor to (`celsius` in the above example) calls the appropriate descriptor method.

`instance` in `__get__` is the instance of the class (so above, `__get__` would receive `temp`, while `owner` is the class with the descriptor (so it would be `Temperature`).

You need to use a descriptor class to encapsulate the logic that powers it. That way, if the descriptor is used to cache some expensive operation (for example), it could store the value on itself and not its class.

The official Python documentation includes an article about descriptors that walks through how they work in more detail, including several examples.

EDIT: As jchl pointed out in the comments, if you simply try `Temperature.celsius`, `instance` will be `None`.

Problem

I am trying to understand what Python's descriptors are and what they are useful for. I understand how they work, but here are my doubts. Consider the following code: ``` class Celsius(object): def __init__(self, value=0.0): self.value = float(value) def __get__(self, instance, owner): return self.value def __set__(self, instance, value): self.value = float(value) class Temperature(object): celsius = Celsius() ``` Why do I need the descriptor class? What is `instance` and `owner` here? (in `__get__`). What is the purpose of these parameters? How would I call/use this example?

Original source

Related problems