Code Explanation:
1. Defining Class D (Descriptor Class)
class D:
Here, a class D is defined. This class will act as a descriptor because it implements special methods like __get__.
2. Defining __get__ Method
def __get__(self, obj, objtype):
return 50
__get__ is a descriptor method.
It is automatically called when the attribute is accessed.
self → instance of descriptor (D)
obj → instance of class A (i.e., a)
objtype → class A
It always returns 50, no matter what.
3. Defining Class A
class A:
A normal class is created.
4. Assigning Descriptor to Attribute x
x = D()
Here, x is assigned an instance of class D.
This makes x a descriptor attribute of class A.
5. Creating Object of Class A
a = A()
An object a of class A is created.
6. Assigning Value to a.x
a.x = 10
This creates an instance attribute x inside object a.
Normally, this would override the class attribute.
BUT: since D is a non-data descriptor (only __get__, no __set__),
instance attribute takes priority.
7. Accessing a.x
print(a.x)
Python first checks instance dictionary → finds x = 10
Since descriptor has no __set__, it is a non-data descriptor
So instance value is used instead of descriptor
Final Output
10

0 Comments:
Post a Comment