類別名.變數
或 物件.__class__.變數
的方式來讀取=
時,則會建立新的物件變數class C:
va = 3.3
a = C()
b = C()
print(a.va)
print(b.va)
# 3.3
# 3.3
# 無此物件變數,往上找同名的類別變數
C.va = 5.5
# 亦可使用 a.__class__.va = 5.5
print(a.va)
print(b.va)
# 5.5
# 5.5
# 類別變數變更,相關物件一起變更
b.va = 6.6
print(b.va)
print(C.va)
# 6.6
# 5.5
# b 物件使用賦值,建立新的物件變數,已跟類別變數不同
__
且最後無雙底線 __
,就會變成私有變數或私有方法_類別名稱
,稱為修飾名稱(mangled name)
dir(物件)
來查看class M:
def __init__(self):
self.x = 2
self.__y = 5
# __y 屬於私有變數
def print_y(self):
print(self.__y)
def __print_x(self):
# __print_x 屬於私有方法
print(self.x)
m = M()
print(m.x)
# 2
m.print_y()
# 5
# 內部可使用私有變數或方法
print(m.y)
m.__print_x()
# 會跳錯
# 私有變數或方法無法直接存取
# 使用 dir(m) 可看到裡面有
# '_M__print_x', '_M__y'
print(m._M__y)
# 5
m._M__print_x()
# 2
小補充
_
變數屬於約定成俗的私有變數用法,但無強制力持續研究類別,感覺好多資訊啊!