Mike的Python學院

OOP、Python、物件導向程式設計

Mike Ku

Learn Code With Mike品牌創辦人

2021/10/22

Python封裝(Encapsulation)實用教學

Q:什麼是Python封裝(Encapsulation)
封裝(Encapsulation)的概念就有點像權限控制,有些屬性(Attribute)或方法(Method)只想於類別內部使用,而不想公開於外部,除了減少程式碼因來源端不適當的使用發生問題外,也可保護其中重要的商業邏輯。
一般情況下,來源端皆可存取類別中公開的屬性(Attribute)及方法(Method),如下範例:
# 部落格類別
class Blog:
def __init__(self):
self.author = "Mike" # 作者屬性
self.titles = [] # 文章標題屬性
def add_post(self, title): # 新增文章
self.titles.append(title)
blog = Blog()
blog.add_post("Python Programming")
blog.add_post("Learn How to Code")
print("Author: ", blog.author)
print("Blog Titles: ", blog.titles)
如果我們要防止來源端存取作者屬性(Attribute)及呼叫新增文章標題方法(Method),則需透過封裝(Encapsulation)的概念來進行設計。接下來就分別說明如何封裝(Encapsulation)類別中的屬性(Attribute)及方法(Method)。
Q:什麼是私有屬性(Private Attribute)?
在類別(Class)中可以進行存取,而外部無法存取的屬性(Attribute)。使用方式就是在私有屬性(Private Attribute)前加上兩個底線(__),如下範例:
# 部落格類別
class Blog:
def __init__(self):
self.__author = "Mike" # 作者屬性
self.__titles = [] # 文章標題屬性
def __add_post(self, title): # 新增文章
self.__titles.append(title)
blog = Blog()
print(blog.__author)
從範例中可以看到,來源端無法存取到類別中的author及titles私有屬性(Private Attribute)。如果是利用Visual Studio Code來開發Python的話,在來源端物件的IntelliSense清單中就選不到私有屬性(Private Attribute),證明成功將其進行封裝(Encapsulation)。
但是Python不像其他物件導向程式語言真的把屬性(Attribute)或方法(Method)變為私有,事實上來源端還是可以存取得到。Python事實上把加了兩個底線的私有屬性(Private Attribute)重新命名,在前面加上了底線類別名稱,來源端只要透過此名稱還是可以進行存取,如下範例:
blog = Blog()
print(blog._Blog__author) #執行結果為:Mike
所以在類別中的屬性(Attribute)或方法(Method)加上兩個底線(__)主要是告訴來源端此屬性(Attribute)或方法(Method)為私有,避免來源端直接或意外的存取。
Q:什麼是私有方法(Private Method)?
在類別(Class)中可以進行存取,而外部無法存取的方法(Method)。和私有屬性(Private Attribute)作法相同,在私有方法(Private Method)前面加上兩個底線(__),如下範例:
# 部落格類別
class Blog:
def __init__(self):
self.__author = "Mike" # 作者屬性
self.__titles = [] # 文章標題屬性
def __add_post(self, title): # 新增文章
self.__titles.append(title)
blog = Blog()
blog.__add_post("Python tutorials")
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike( https://www.learncodewithmike.com/2020/01/python-encapsulation.html )網站觀看更多精彩內容。
0 0 1644 0