搞砸私用名稱

  • 在上一節的 Duck 類別範例中,呼叫(不完整)隱藏的屬性 hidden_name
  • 對於不能被類別定義式之外的程式看到的屬性,Python 有一個命名規範:在開頭使用雙底線(__)
  • 注意,它並未在 getter 內印出
  • 雖然,這不是完美的保護方式,但弄亂名稱可以防止有人不小心或故意直接存取屬性
# 來將 hidden_name 改為 __name,如下所示:
>> class Duck():
    def __init__(self, input_name):
        self.__name = input_name
    @property
    def name(self):
        print('inside the getter')
        return self.__name
    @name.setter
    def name(self, input_name):
        print('inside the setter')
        self.__name = input_name


# 花點時間查看是不是一切都 OK:
>>> fowl = Duck('Howard')
>>> fowl.name
inside the getter
'Howard'
>>> fowl.name = 'Donald'
inside the setter
>>> fowl.name
inside the getter
'Donald'


# 看起來很好。而且無法存取 __name 屬性
>>> fowl.__name
Traceback (most recent call last):
  File "<pyshell#97>", line 1, in <module>
    fowl.__name
AttributeError: 'Duck' object has no attribute '__name'


# 這種命名規範「並未將它變成私用」,但 Python 會「弄亂名稱」,讓「外部程式幾乎不可能使用它」
# 如果你很好奇,而且保證不會告訴別人,以下是它變成的樣子
>>> fowl._Duck__name
'Donald'

# 雖然,這不是完美的保護方式,但弄亂名稱可以防止有人不小心或故意直接存取屬性

results matching ""

    No results matching ""