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 中沒有。
封裝使你可以更好地控制程式碼中的耦合程度,它允許類更改其實現而不會影響程式碼的其他部分。