在 Python 中,類變量是指屬于類而不屬于任何一個實例的變量。類變量的值可以被所有該類的實例共享,而且只有一個副本存在于內存中。
class MyClass: class_var = 0 def __init__(self, inst_var): self.inst_var = inst_var def increment(self): MyClass.class_var += 1 self.inst_var += 1
在這個例子中,class_var
是一個類變量,而inst_var
是實例變量。在increment
方法中,我們對類變量和實例變量都做了增量操作。
obj1 = MyClass(1) obj2 = MyClass(2) print(obj1.class_var, obj1.inst_var) # 0 1 print(obj2.class_var, obj2.inst_var) # 0 2 obj1.increment() # MyClass.class_var += 1, obj1.inst_var += 1 obj2.increment() # MyClass.class_var += 1, obj2.inst_var += 1 print(obj1.class_var, obj1.inst_var) # 2 2 print(obj2.class_var, obj2.inst_var) # 2 3
我們可以發現,每個實例都可以訪問類變量和實例變量,但每個實例訪問的類變量都指向同一個內存地址,因此對其中一個實例的類變量做變動,會影響到所有實例的類變量。
如果你想在一個類方法中訪問類變量,可以使用cls
關鍵字代替類名。這樣可以避免在子類中出現意外的問題。
class MyClass: class_var = 0 @classmethod def increment(cls): cls.class_var += 1
使用類變量時,建議在訪問類變量的地方使用類名而不是實例名,以避免在子類中出現意外的問題。
class Parent: class_var = 0 class Child(Parent): class_var = 1 print(Parent.class_var) # 0 print(Child.class_var) # 1 obj1 = Parent() obj2 = Child() print(obj1.class_var) # 0 print(obj2.class_var) # 1
在這個例子中,子類Child
繼承了父類Parent
的類變量class_var
,并修改了它的值。我們通過實例訪問類變量時,可以看到它們確實具有不同的值。
總之,類變量是一個很有用的工具,可以用于實現需要被所有實例共享但不依賴于實例的狀態。但是需要注意使用時萬一可能會遇到的問題。