Overview

Python 的 Getter/Setter 建立方法。

<aside> 💡 Attribute vs Property

不使用 Getter/Setter

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,不使用 Property

如果不使用 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,使用 Property

而如果只使用 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

此處作了一些修改

使用 Decorator

也可以使用 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

Reference