封裝是對(duì)全局作用域中其它區(qū)域隱藏多余信息的原則。
封裝聽(tīng)起來(lái)有些像多態(tài),因?yàn)樗麄兌际?抽象的原則---他們都會(huì)幫助處理程序組件而不用過(guò)多關(guān)心多余細(xì)節(jié),就像函數(shù)做的一樣。但是封裝并不等同于多態(tài)。多態(tài)的可以讓用戶(hù)對(duì)于不知道是什么類(lèi)(或?qū)ο箢?lèi)型)的對(duì)象進(jìn)行方法調(diào)用,而封裝是可以不用關(guān)心對(duì)象是如何構(gòu)建的而直接進(jìn)行使用。
創(chuàng)建一個(gè)有對(duì)象(通過(guò)像調(diào)用函數(shù)一樣調(diào)用類(lèi))后,將變量c綁定到該對(duì)象上。可以使用set和 get 方法如:
>>>class Person:
>>> ? ? ?def __init__(self,name): ? -->初始化函數(shù),對(duì)對(duì)象的屬性初始化
>>> ? ? ? ? ? ? ? ? self.__name=name-->通過(guò)傳參數(shù),為私有變量__name復(fù)賦值
>>> ? ? ?def get_name(self):-->定義公有g(shù)et函數(shù),用以類(lèi)外獲取對(duì)象私有屬性的值
>>> ? ? ? ? ? ? ? ? return self.__name
>>> ? ? ?def set_name(self,n):-->定義公有set函數(shù),用以類(lèi)外修改私有屬性的值
>>> ? ? ? ? ? ? ? ? self.__name=n
>>>person=Person("tom")
>>>print(person.get_name())
>>>person.set_name("tony')
>>>print(person.get_name())
這個(gè)程序就實(shí)現(xiàn)了封裝,將__name屬性定義為私有屬性,外界不可對(duì)其直接訪問(wèn),只能通過(guò)類(lèi)內(nèi)定義的set和get函數(shù)實(shí)現(xiàn)對(duì)屬性的修改和提取,最終輸出的結(jié)果是("tom")("tony")y
@property,@(method).setter這兩個(gè)注解更加嚴(yán)密的隱藏了類(lèi)的方法,把set和get函數(shù)注解為對(duì)象,然后用對(duì)象的操作方法操作這兩個(gè)函數(shù)如:
>>> ? ? ?@property
>>>? ? ? def get_name(self):-->定義公有g(shù)et函數(shù),用以類(lèi)外獲取對(duì)象私有屬性的值
>>> ? ? ? ? ? ? ? ? return self.__name
>>> ? ? ?@get_name.setter
>>> ? ? ?def set_name(self,n):-->定義公有set函數(shù),用以類(lèi)外修改私有屬性的值
>>> ? ? ? ? ? ? ? ? self.__name=n
函數(shù)的重載使面向?qū)ο蟮姆庋b達(dá)到了一個(gè)新的高度,搭配@property和@(method).setter使函數(shù)的工作方法徹底隱藏,函數(shù)的重載又稱(chēng)為偽方法重載,偽方法重載:python中,默認(rèn)不提供方法重載,但是在高級(jí)封裝的過(guò)程中,又出現(xiàn)了類(lèi)似方法重載的代碼語(yǔ)法,所以~稱(chēng)之為偽方法重載,語(yǔ)法如下:
>>>? ? ? @property
>>>? ? ? def name(self):
>>> ? ? ? ? ? ? ? ? return self.__name
>>> ? ? ?@get_name.setter
>>> ? ? ?def name(self,n):
>>> ? ? ? ? ? ? ? ? self.__name=n
這里有兩個(gè)函數(shù)名為name的函數(shù),雖然有不同的函數(shù)作用,但是函數(shù)名相同,參數(shù)不同,這種方式成為偽方法重載,在類(lèi)外調(diào)用時(shí),跟對(duì)象的使用方式一樣,所以可以很好的隱藏工作方法
將對(duì)象的數(shù)據(jù)與操作數(shù)據(jù)的方法相結(jié)合,通過(guò)方法將對(duì)象的數(shù)據(jù)與實(shí)現(xiàn)細(xì)節(jié)保護(hù)起來(lái),就稱(chēng)為封裝。外界只能通過(guò)對(duì)象的方法訪問(wèn)對(duì)象,因此封裝同時(shí)也實(shí)現(xiàn)了對(duì)象的數(shù)據(jù)隱藏。
在使用面向?qū)ο蟮姆庋b特性時(shí),需要:將內(nèi)容封裝到某處,和從某處調(diào)用被封裝的內(nèi)容
總體來(lái)說(shuō),封裝的意義就是實(shí)現(xiàn)了對(duì)象的數(shù)據(jù)隱藏