封裝
在類別裏, 通常會定義其他的方法進行資料的運算, 從外界只需知道有那些方法可以調用, 而不需要知道運算的內容, 這現象在物件導向裏稱為封裝, 如下代碼的getGrade()
class Pokemon(object): def __init__(self, name, level): self.level=level self.name=name print("%s出生了, 等級為%d" % (self.name, self.level)) def getGrade(self): if self.level>=100: return "A" elif self.level>=50: return "B" else: return "C" s1=Pokemon("Eve", 100) print(s1.getGrade())
權限(Permission)
物件變數到目前為止, 都可以直接從外面調用, 如p1.level. 如果一下就把p1.level=5000, 那神奇寶貝的等級不就隨意的就變的很強了嗎. 所以為了讓外界無法直接調用, 就要把level變成private, 就是在變數前加二個底線, 如 __level.但請注意一下, 如果變數後面也有二個底線的話, 如 __level__, 這下又變成了public的特殊變數, 外界一樣可以直接使用. 請看下面代碼
class Pokemon(object): def __init__(self, name, level): self.__level=level self.name=name p1=Pokemon("Eve", 100) #print("s1的名字 %s" % p1.__level) print(p1._Pokemon__level) # 破解法
上面代碼最後面, p1._Pokemon__level, 竟然可以直接調用, 此為其破解法. 總之, Python無法阻止你幹壞事, 這就是安全隱憂的地方.
存取器(getter/setter)
一旦變數設為private, 外界無法取得並設定, 所以通常就會新增二個public 方法對其變數進行存取, 這二個方法稱為存取器, 如下代碼所示.
class Pokemon(object): def __init__(self, name): self.name=name def setLevel(self, level): if level>=10: self.__level=1 else: self.__level=level def getLevel(self): return self.__level p1=Pokemon("Eve") p1.setLevel(100) print("%s的level : %d" % (p1.name, p1.getLevel()))