Python 的 Getter/Setter 建立方法。
<aside> 💡 Attribute vs Property
class Ball:
def __init__(self, radius):
self.radius = radius
ball = Ball(10)
print(ball.radius) # 10
ball.radius = 20
print(ball.radius) # 20
如果不使用 Getter/Setter 通常難以對傳入的參數做檢查,例如檢查半徑大小必須大於 0。這時候就可以使用 Getter/Setter,建立一個 method 來做檢查。
class Ball:
def __init__(self, radius):
self.radius = radius
def get_radius(self):
return self.radius
def set_radius(self, radius):
self.radius = radius
ball = Ball(10)
print(ball.getRadius()) # 10
ball.setRadius(20)
print(ball.getRadius()) # 20
而如果只使用 Getter/Setter,修改時勢必需要尋找每個有使用到該類別的程式碼,修改成 Getter/Setter 的樣式,這樣並不 Pythonic,如此繁複的步驟,可以使用 Property 加以省略,讓 Getter/Setter 的方法可以照舊使用。
class Ball:
def __init__(self, radius):
self.__radius = radius
def get_radius(self):
return self.__radius
def set_radius(self, radius):
self.__radius = radius
def del_radius(self):
del self.__radius
radius = property(get_radius, set_radius, del_radius, 'radius __doc__')
ball = Ball(10)
print(ball.radius) # 10
ball.radius = 20
print(ball.radius) # 20
此處作了一些修改
radius
改成 __radius
,避免產生變數衝突deleter
也可以使用 Decorator 來加上 Property。
class Ball:
def __init__(self, radius):
self.__radius = radius
# Getter
@property
def radius(self):
"""
radius __doc__
"""
return self.__radius
# Setter
@radius.setter
def radius(self, radius):
self.__radius = radius
# Deleter
@radius.deleter
def radius(self):
del self.__radius
ball = Ball(10)
print(ball.radius) # 10
ball.radius = 20
print(ball.radius) # 20