Code Explanation:
1. Defining a Custom Metaclass
class Meta(type):
Meta is a metaclass because it inherits from type.
A metaclass controls how classes are created.
2. Overriding the Metaclass __new__ Method
def __new__(cls, name, bases, dct):
dct["x"] = dct.get("x", 0) + 1
return super().__new__(cls, name, bases, dct)
This method runs every time a class using this metaclass is created.
Parameters:
cls → the metaclass (Meta)
name → class name ("A", "B")
bases → parent classes
dct → dictionary of class attributes
What it does:
Looks for key "x" in the class dictionary.
If "x" exists, it takes its value; otherwise uses 0.
Adds 1 to it and stores it back as "x".
So the metaclass increments x by 1 during class creation.
3. Creating Class A
class A(metaclass=Meta):
x = 5
What happens internally:
Class body executes: dct = {"x": 5}
Meta.__new__(Meta, "A", (), {"x": 5}) is called.
Inside __new__:
dct["x"] = 5 + 1 = 6
Class A is created with:
A.x = 6
4. Creating Class B
class B(A):
pass
B inherits from A, so it also uses metaclass Meta.
Class body is empty: dct = {}
Meta.__new__(Meta, "B", (A,), {}) is called.
Inside __new__:
dct["x"] = 0 + 1 = 1
So B gets its own class attribute:
B.x = 1
5. Printing the Values
print(A.x, B.x)
print(A.x, B.x)
A.x is 6
B.x is 1
6. Final Output
6 1

0 Comments:
Post a Comment