Python 封裝

在物件導向的 Python 程式中,你可以限制對方法和變數的訪問。這可以防止資料被意外修改,並稱為封裝。讓我們從一個例子開始吧。

私有方法

封裝對方法或變數的訪問受限制

我們建立了一個類 Car,它有兩個方法:drive()updateSoftware()。建立 Car 物件時,它將呼叫私有方法 __updateSoftware()

此函式不能直接在物件上呼叫,只能在類中呼叫。

#!/usr/bin/env python
 
class Car:
 
    def __init__(self):
        self.__updateSoftware()
 
    def drive(self):
        print 'driving'
 
    def __updateSoftware(self):
        print 'updating software'
 
redcar = Car()
redcar.drive()
#redcar.__updateSoftware()  not accesible from object.

該程式將輸出:

updating software
driving

封裝可防止不是無意的意外訪問。

私有屬性和方法並沒有真正隱藏,它們被重新命名,在名稱的開頭新增 _Car

實際上可以使用 redcar._Car__updateSoftware() 呼叫該方法

私有變數

具有私有變數的類

變數可以是私有的,可以在很多場合使用。私有變數只能在類方法中更改,而不能在類之外更改。

物件可以為你的應用程式儲存關鍵資料,並且你不希望資料可以在程式碼中的任何位置更改。

一個例子:

#!/usr/bin/env python
 
class Car:
 
    __maxspeed = 0
    __name = ""
 
    def __init__(self):
        self.__maxspeed = 200
        self.__name = "Supercar"
 
    def drive(self):
        print 'driving. maxspeed ' + str(self.__maxspeed)
 
redcar = Car()
redcar.drive()
redcar.__maxspeed = 10  # will not change variable because its private
redcar.drive()

如果要更改私有變數的值,則使用 setter 方法。這只是一個設定私有變數值的方法。

#!/usr/bin/env python
 
class Car:
 
    __maxspeed = 0
    __name = ""
 
    def __init__(self):
        self.__maxspeed = 200
        self.__name = "Supercar"
 
    def drive(self):
        print 'driving. maxspeed ' + str(self.__maxspeed)
 
    def setMaxSpeed(self,speed):
        self.__maxspeed = speed
 
redcar = Car()
redcar.drive()
redcar.setMaxSpeed(320)
redcar.drive()

你為什麼要創造它們?因為你可能希望在建立物件後更改某些私有值,而其他值可能根本不需要更改。

Python 封裝

總而言之,在 Python 中有:

型別 描述
公共方法 可從任何地方訪問
私人方法 只能在自己的類中訪問。從兩個下劃線開始
公共變數 可從任何地方訪問
私有變數 只能在自己的類中或通過定義的方法訪問。從兩個下劃線開始

其他程式語言也有保護類方法,但 Python 中沒有。

封裝使你可以更好地控制程式碼中的耦合程度,它允許類更改其實現而不會影響程式碼的其他部分。