Types of Descriptors
Get a brief overview of the two types of descriptors.
We'll cover the following
Based on the methods we've just explored, we can make an important distinction among descriptors in terms of how they work. Understanding this distinction plays an important role in working effectively with descriptors and will also help to avoid caveats or common errors at runtime.
If a descriptor implements the __set__
or __delete__
methods, it is called a data descriptor. Otherwise, a descriptor that solely implements __get__
is a non–data descriptor. Notice that __set_name__
doesn't affect this classification at all.
When trying to resolve an attribute of an object, a data descriptor will always take precedence over the dictionary of the object, whereas a non–data descriptor will not. That means that in a non–data descriptor if the object has a key on its dictionary with the same name as the descriptor, then that will always be called, and the descriptor itself will never run.
Conversely, in a data descriptor, even if there is a key in the dictionary with the same name as the descriptor, this one will never be used since the descriptor itself will always end up being called.
Non–data descriptors
We will start with a descriptor that only implements the __get__
method, and see how it is used. As usual, if we ask for the descriptor
, we get the results of its __get__
method:
Get hands-on with 1400+ tech skills courses.