Code Explanation:
๐น 1. Descriptor Class Definition
class Descriptor:
You define a class named Descriptor.
This will act as a descriptor because it implements special methods.
๐น 2. Defining __get__ Method
def __get__(self, obj, objtype):
return 50
This makes the class a non-data descriptor (because only __get__ is defined).
Parameters:
self → descriptor instance
obj → instance of Test (i.e., obj)
objtype → class Test
Whenever the descriptor is accessed, it returns 50.
๐น 3. Test Class Definition
class Test:
A new class Test is defined.
๐น 4. Assigning Descriptor to Class Attribute
x = Descriptor()
x becomes a descriptor object.
It is stored in the class namespace (Test.__dict__).
This means x is controlled by descriptor behavior.
๐น 5. Object Creation
obj = Test()
Creates an instance of the Test class.
๐น 6. Setting Instance Attribute
obj.x = 100
This creates an instance attribute x inside obj.__dict__.
Important:
Since Descriptor is a non-data descriptor (no __set__),
instance attributes take priority over the descriptor.
๐น 7. Accessing obj.x
print(obj.x)
Let’s break the lookup process:
➤ Step-by-Step Attribute Lookup
Python checks:
Does class have a data descriptor (__get__ + __set__)?
❌ No → skip
Check instance dictionary:
obj.__dict__ → {'x': 100}
✔️ Found → returns 100
Descriptor is ignored because:
Non-data descriptors have lower priority than instance attributes
๐น 8. Final Output
100

0 Comments:
Post a Comment