[Python] setter 和 getter

Bryan Yang
A multi hyphen life
5 min readMar 28, 2018

從鋼彈學 python 第一彈

在物件導向程式裡面,封裝是個很基本的要素.不讓外部使用者直接碰到物件的內容,而只能透過方法來修改或取用內部的屬性.

例如這邊有個鋼彈 class,初始化時要填入駕駛名字:

class gundam(object):
def __init__(self, driver):
self.driver = driver

雖然可以向下列方式實體化鋼彈,和取得駕駛名稱,但是這樣的方式也會讓使用者輕易把駕駛替換掉.

為了安全,我們將駕駛換成私有屬性:

class gundam(object):
def __init__(self, driver):
self._driver = driver

這樣雖然駕駛變安全了,但是卻沒辦法取出

Get 和 Set

因此我們再換個寫法,加上 get 和 set 方法來操作私有屬性:

class gundam(object):
def __init__(self, driver):
self._driver = driver
def get_driver(self):
return self._driver
def set_driver(self, new_driver):
self._driver = new_driver

透過這樣的設計就能確保使用者一定得透過方法來查看私有屬性.

Property

如果不想讓取出那麼麻煩, Python 有一種方式可以將私有屬性讓使用者用起來像公開屬性一樣,就是加上 property 這個裝飾子.

class gundam(object):
def __init__(self, driver):
self._driver = driver
@property
def driver(self):
return self._driver
def set_driver(self, new_driver):
self._driver = new_driver

透過 property 可以將該方法轉變成屬性的操作方式,這樣的話使用者仍然可以透過 g4.driver 來查看屬性但不能直接複寫屬性

setter and getter

另外還有一個更 python 的寫法是這樣:

class gundam(object):
def __init__(self, driver=None):
self.driver = driver
@property
def driver(self):
print('get driver')
return self._driver
@driver.setter
def driver(self, new_driver):
print('set driver')
self._driver = new_driver

一開始初始化的時候,雖然是寫 self.driver = driver ,這時候就會呼叫 setter 函數,使用者輸入的參數便指派到 self._driver 中.之後用 g8.driver 的時候就會直接取出 self._driver 出來.

用起來就跟一開始的範例一模一樣,但是背後其實是在操作私有屬性.使用者也更容易透過 setter 方法來管理使用者輸入的值.

class gundam(object):
def __init__(self, driver=None):
self.driver = driver
@property
def driver(self):
print('get driver')
return self._driver
@driver.setter
def driver(self, new_driver):
print('set driver')
if type(new_driver) == str:
self._driver = new_driver
else:
raise TypeError('driver need str.')

--

--

Bryan Yang
A multi hyphen life

Data Engineer, Data Producer Manager, Data Solution Architect