Code Explanation:
1. Defining the Descriptor Class
class D:
A class named D is defined.
This class is a descriptor because it implements __get__.
2. Implementing the __get__ Method
def __get__(self, obj, owner):
return obj.__dict__.get("x", 0)
__get__ is called whenever the attribute x is accessed.
obj → the instance (a or b)
owner → the class (A)
It looks inside the instance dictionary (obj.__dict__) for "x".
If "x" exists, it returns its value; otherwise it returns 0.
So the descriptor stores values inside each object, not in the descriptor itself.
3. Using the Descriptor in a Class
class A:
x = D()
x is a class attribute managed by descriptor D.
Any access to obj.x triggers D.__get__.
4. Creating Objects
a = A()
b = A()
Two separate instances of A are created: a and b.
Initially:
a.__dict__ = {}
b.__dict__ = {}
5. Assigning to a.x
a.x = 5
This does not call __set__ because D does not define __set__.
So Python treats a.x = 5 as a normal instance attribute assignment.
It creates:
a.__dict__["x"] = 5
6. Accessing b.x
print(b.x)
What happens internally:
Python finds x on the class as a descriptor.
Calls:
D.__get__(D_instance, b, A)
obj.__dict__ is b.__dict__, which is {}.
"x" is not found → returns 0.
7. Final Output
0
Final Answer
✔ Output:
0
.png)

0 Comments:
Post a Comment