1. 程式人生 > >資料封裝私有屬性和方法

資料封裝私有屬性和方法

1.私有屬性的封裝

私有屬性的含義是外部不能直接用 例項名.私有屬性名進行訪問,子類同樣也是一樣不能訪問, 這樣就是對資料進行封裝。只能用公共的方法裡呼叫私有屬性。 請看下這個例子``

class Date:
    def __init__(self,birthday):
        self.__birthday=birthday

date=Date(1960)

print(date.__birthday)
#列印報錯如下
AttributeError: 'Date' object has no attribute '__birthday'

從報錯的結果看,沒有 ‘__birthday’這個屬性, 如果把’__birthday’ 變成‘birthday’ 相信是會執行通過的, 他們的唯一區別是 有沒有雙下劃線,從而得出 如果想封裝私有屬性就在屬性名稱前加上雙下劃線。 目的為了有效資訊不被暴漏出來。

那如何能訪問這個私有屬性呢,答案是 通過方法進行返回。

class Date:
    def __init__(self,birthday):
        self.__birthday=birthday
    def get_birthday(self):     #定義私有屬性的返回結果,方法裡應該有對私有屬性處理。
        return self.__birthday

date=Date(1960)

print(date.get_birthday())

#列印結果 
1960

同理方法名私有屬性,也是可以在方法名之前加上雙下劃線,同樣也是不能訪問。

class Date:
    def __init__(self,birthday):
        self.__birthday=birthday
    def __get_birthday(self):
        return self.__birthday

date=Date(1960)

print(date.__get_birthday())
#報錯  AttributeError: 'Date' object has no attribute '__get_birthday'  
#解決方法和上邊的一樣。

2.私有屬性封裝原理

class Date:
    def __init__(self,birthday):
        self.__birthday=birthday
    def __get_birthday(self):
        return self.__birthday

date=Date(1960)
print(date._Date__birthday)
print(date._Date__get_birthday())
#列印結果如下,突然都有結果了 
1960
1960

通過以上的結果得出,Python 會對私有屬性進行了處理 從 ’birthday‘ 屬性變成 ‘._Date__birthday’ Date 是類名。 只是個小技巧。只是相對的安全,並不能保證絕對安全。