Code Explanation:
๐น 1️⃣ Defining Descriptor Class D
class D:
A class named D is created.
This class will act as a descriptor.
๐น 2️⃣ Defining the __get__ Method
def __get__(self, obj, objtype):
return 100
This method runs when the attribute is accessed.
Parameters:
self → descriptor object
obj → instance accessing the attribute (a)
objtype → class of the instance (A)
Behavior:
return 100
So whenever the attribute is accessed, the value 100 is returned.
๐น 3️⃣ Defining the __set__ Method
def __set__(self, obj, value):
obj.__dict__['x'] = value
This method runs when the attribute is assigned.
Example:
a.x = 5
Execution:
obj.__dict__['x'] = value
So internally Python stores:
a.__dict__['x'] = 5
๐น 4️⃣ Defining Class A
class A:
A class named A is created.
๐น 5️⃣ Assigning Descriptor to Class Attribute
x = D()
Here:
An instance of D is assigned to x.
Internally:
A.x → descriptor object
So x is now controlled by the descriptor D.
๐น 6️⃣ Creating an Object
a = A()
An instance a of class A is created.
Initially:
a.__dict__ = {}
๐น 7️⃣ Assigning Value to a.x
a.x = 5
Python sees that x is a descriptor with __set__.
So it calls:
D.__set__(descriptor, a, 5)
Inside the method:
a.__dict__['x'] = 5
Now:
a.__dict__ = {'x': 5}
๐น 8️⃣ Accessing a.x
print(a.x)
Now Python performs attribute lookup.
Lookup order:
1️⃣ Data descriptor
Since x is a data descriptor, Python calls:
D.__get__(descriptor, a, A)
Inside __get__:
return 100
๐น 9️⃣ Instance Dictionary Ignored
Even though:
a.__dict__['x'] = 5
Python ignores it because:
⚠ Data descriptors take priority over instance attributes.
✅ Final Output
100

0 Comments:
Post a Comment