iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
Software Development

Python 微進階系列 第 18

Python 微進階 Day18 - class(類別) - 2 - class variables、private variable、private method

  • 分享至 

  • xImage
  •  

class(類別)

class variables(類別變數)

  • class variables(類別變數)是直接定義在類別內的變數
  • 每個使用此類別的物件都會有同樣的變數值,同樣若變更類別變數則全部會一起變更
  • 可使用 類別名.變數物件.__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 物件使用賦值,建立新的物件變數,已跟類別變數不同

private variable(私有變數)、private method(私有方法)

  • 在變數或方法的命名,開頭加上雙底線 __且最後無雙底線 __,就會變成私有變數或私有方法
  • 只有在類別或所屬的物件內部使用
  • Python 的私有變數或方法並非強制不可存取,而是會在執行前在名稱前加入 _類別名稱,稱為修飾名稱(mangled name)
    • 可用 dir(物件) 來查看
  • 這種防止外部存取變數或方法的概念稱為 encapsulation(封裝),可以保護程式碼內的實作細節不被外部取得,以防止被外部不當的直接存取
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

小補充

  • 單底線 _ 變數屬於約定成俗的私有變數用法,但無強制力

參考資料

次回

持續研究類別,感覺好多資訊啊!


上一篇
Python 微進階 Day17 - class(類別) - 1 - __init__、method
下一篇
Python 微進階 Day19 - class(類別) - 3 - @staticmethod、@classmethod
系列文
Python 微進階31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言