封裝是對全局作用域中其它區(qū)域隱藏多余信息的原則。
封裝聽起來有些像多態(tài),因為他們都是 抽象的原則---他們都會幫助處理程序組件而不用過多關(guān)心多余細(xì)節(jié)狞玛,就像函數(shù)做的一樣。但是封裝并不等同于多態(tài)涧窒。多態(tài)的可以讓用戶對于不知道是什么類(或?qū)ο箢愋停┑膶ο筮M(jìn)行方法調(diào)用心肪,而封裝是可以不用關(guān)心對象是如何構(gòu)建的而直接進(jìn)行使用。
創(chuàng)建一個有對象(通過像調(diào)用函數(shù)一樣調(diào)用類)后纠吴,將變量c綁定到該對象上硬鞍。可以使用set和 get 方法如:
>>>class Person:
>>> ? ? ?def __init__(self,name): ? -->初始化函數(shù)戴已,對對象的屬性初始化
>>> ? ? ? ? ? ? ? ? self.__name=name-->通過傳參數(shù)固该,為私有變量__name復(fù)賦值
>>> ? ? ?def get_name(self):-->定義公有g(shù)et函數(shù),用以類外獲取對象私有屬性的值
>>> ? ? ? ? ? ? ? ? return self.__name
>>> ? ? ?def set_name(self,n):-->定義公有set函數(shù)糖儡,用以類外修改私有屬性的值
>>> ? ? ? ? ? ? ? ? self.__name=n
>>>person=Person("tom")
>>>print(person.get_name())
>>>person.set_name("tony')
>>>print(person.get_name())
這個程序就實現(xiàn)了封裝蹬音,將__name屬性定義為私有屬性,外界不可對其直接訪問休玩,只能通過類內(nèi)定義的set和get函數(shù)實現(xiàn)對屬性的修改和提取,最終輸出的結(jié)果是("tom")("tony")y
@property劫狠,@(method).setter這兩個注解更加嚴(yán)密的隱藏了類的方法拴疤,把set和get函數(shù)注解為對象,然后用對象的操作方法操作這兩個函數(shù)如:
>>> ? ? ?@property
>>>? ? ? def get_name(self):-->定義公有g(shù)et函數(shù)独泞,用以類外獲取對象私有屬性的值
>>> ? ? ? ? ? ? ? ? return self.__name
>>> ? ? ?@get_name.setter
>>> ? ? ?def set_name(self,n):-->定義公有set函數(shù)呐矾,用以類外修改私有屬性的值
>>> ? ? ? ? ? ? ? ? self.__name=n
函數(shù)的重載使面向?qū)ο蟮姆庋b達(dá)到了一個新的高度,搭配@property和@(method).setter使函數(shù)的工作方法徹底隱藏懦砂,函數(shù)的重載又稱為偽方法重載蜒犯,偽方法重載:python中组橄,默認(rèn)不提供方法重載,但是在高級封裝的過程中罚随,又出現(xiàn)了類似方法重載的代碼語法玉工,所以~稱之為偽方法重載,語法如下:
>>>? ? ? @property
>>>? ? ? def name(self):
>>> ? ? ? ? ? ? ? ? return self.__name
>>> ? ? ?@get_name.setter
>>> ? ? ?def name(self,n):
>>> ? ? ? ? ? ? ? ? self.__name=n
這里有兩個函數(shù)名為name的函數(shù)淘菩,雖然有不同的函數(shù)作用遵班,但是函數(shù)名相同,參數(shù)不同潮改,這種方式成為偽方法重載狭郑,在類外調(diào)用時,跟對象的使用方式一樣汇在,所以可以很好的隱藏工作方法
將對象的數(shù)據(jù)與操作數(shù)據(jù)的方法相結(jié)合翰萨,通過方法將對象的數(shù)據(jù)與實現(xiàn)細(xì)節(jié)保護(hù)起來,就稱為封裝糕殉。外界只能通過對象的方法訪問對象亩鬼,因此封裝同時也實現(xiàn)了對象的數(shù)據(jù)隱藏。
在使用面向?qū)ο蟮姆庋b特性時糙麦,需要:將內(nèi)容封裝到某處辛孵,和從某處調(diào)用被封裝的內(nèi)容
總體來說,封裝的意義就是實現(xiàn)了對象的數(shù)據(jù)隱藏