Code Explanation:
1. Defining a Descriptor Class
class Desc:
A class named Desc is defined.
This class is going to act as a data descriptor.
Data descriptors implement at least one of:
__get__
__set__
__delete__
Here we are defining __set__.
2. Defining __set__ Method
def __set__(self, obj, val):
print("SET", val)
This is the critical part:
__set__(self, obj, val) is automatically called when you assign a value to an attribute defined as a descriptor.
Parameters:
self → the descriptor object (Desc instance)
obj → the object whose attribute is being set (a Demo instance)
val → the value being assigned (50)
Instead of storing the value, the method just prints "SET 50"
This is typical in descriptors — they control attribute assignment behavior.
3. Defining a Class That Uses Descriptor
class Demo:
x = Desc()
A class named Demo is created.
x = Desc() means:
Class attribute x refers to an instance of Desc
Therefore, x becomes a managed attribute
Any assignment to d.x will trigger the descriptor’s __set__
This sets up a binding between Demo.x and Desc.set.
4. Creating an Object of Demo
d = Demo()
d is now an instance of Demo.
It inherits the descriptor attribute x.
At this moment:
Nothing prints yet
No setter is called yet
5. Assigning a Value to d.x
d.x = 50
This is where magic happens:
Because x is a descriptor, Python translates this assignment into:
Desc.__set__(<Desc instance>, d, 50)
Meaning:
The descriptor (Desc() instance) receives:
obj = d
val = 50
So the __set__ method executes:
print("SET", 50)
6. Final Output
SET 50


0 Comments:
Post a Comment