[Python] setter 和 getter
Published in
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.')