Code Explanation:
1. Defining a Descriptor Class D
class D:
This defines a class named D.
It is intended to be used as a descriptor.
2. Implementing the __get__ Method
def __get__(self, obj, owner):
return 50
__get__ is a descriptor method.
It is automatically called when the attribute is accessed.
Parameters:
self → the descriptor object (D instance)
obj → the instance accessing the attribute (a)
owner → the class owning the attribute (A)
It always returns 50, regardless of the object or class.
3. Defining Class A
class A:
This defines a class named A.
4. Creating a Descriptor Attribute in Class A
x = D()
x is a class attribute.
It is assigned an instance of D.
Because D defines __get__, x becomes a non-data descriptor
(it has __get__ but no __set__).
5. Creating an Object of Class A
a = A()
An instance a of class A is created.
6. Assigning a Value to a.x
a.x = 10
This creates an instance attribute x in object a.
Since D does not define __set__, it is a non-data descriptor.
Instance attributes override non-data descriptors.
So now:
a.__dict__ = {'x': 10}
7. Accessing a.x
print(a.x)
Python looks for x in the following order:
Instance dictionary (a.__dict__)
Class attributes / descriptors
Since a.__dict__['x'] exists, it is returned.
The descriptor’s __get__ method is not called.
8. Final Output
10

0 Comments:
Post a Comment