封裝Encapsulation

      在〈封裝Encapsulation〉中尚無留言

封裝

在類別裏, 通常會定義其他的方法進行資料的運算, 從外界只需知道有那些方法可以調用, 而不需要知道運算的內容, 這現象在物件導向裏稱為封裝, 如下代碼的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()))

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *