Code Explanation:
1. Defining the Class
class Cache:
A class named Cache is defined.
It does not define any normal attributes like a, b, etc.
2. Defining __getattr__
def __getattr__(self, name):
__getattr__ is a special method.
It is called only when an attribute is NOT found in:
the instance (self.__dict__)
the class
parent classes
3. Creating the Missing Attribute
self.__dict__[name] = 99
A new instance attribute is created dynamically.
The attribute name is whatever was requested (e.g. "a").
The value assigned is 99.
So this line effectively does:
c.a = 99
4. Returning the Value
return 99
The value 99 is returned.
This becomes the result of the attribute access.
5. Creating an Object
c = Cache()
An instance c of class Cache is created.
Initially:
c.__dict__ == {}
6. First Access: c.a
c.a
Step-by-step:
Python looks for a in c.__dict__ → ❌ not found
Looks in class Cache → ❌ not found
Calls __getattr__(self, "a")
Inside __getattr__:
self.__dict__["a"] = 99
Returns 99
Now:
c.__dict__ == {"a": 99}
7. Second Access: c.a
c.a
Step-by-step:
Python looks for a in c.__dict__
Finds a = 99
__getattr__ is NOT called
Returns 99 directly
8. Printing the Values
print(c.a, c.a)
First c.a → 99 (created via __getattr__)
Second c.a → 99 (read from instance)
9. Final Output
99 99
✅ Final Answer
✔ Output:
99 99

0 Comments:
Post a Comment