封裝是是面向的特點之一,同時這也是最重要的,對象可以沒有繼承,可以沒有多態,但是不能沒有封裝,沒有封裝的對象就不是一個合格的對象.
封裝內分為屬性和方法,初次接觸的同學可能不太習慣,但是,不要緊.
你可以把屬性想象成一個人的名字,年齡等信息,通常都是名詞性質的,而方法想象成是一種行為,比如一個人吃飯,睡覺等,通常是具有動詞性質的.
而屬性和方法又有公有和私有的划分,何為公有何為私有?看下面的代碼.
1 #test2.py 2 3 class stu(): 4 def __init__(self, name, age, score): 5 self.__name = name 6 self.age = age 7 self.__score = score
1 #test.py 2 from test2 import * 3 4 xiaoming = stu("xiaoming", 15, 90) 5 6 print(xiaoming.age) 7 print(xiaoming.name)
輸出結果:
15 Traceback (most recent call last): File "G:/Pycharm workspace/myproject/test.py", line 6, in <module> print(xiaoming.name) AttributeError: 'stu' object has no attribute 'name'
大概講解下,我在test2文件中聲明了一個對象,這個對象能夠保存一個人的信息,在test文件中,我進行了實例化,並且想通過實例對象的屬性獲取相應的值.
很明顯,在我打印實例對象年齡時沒有任何問題,而打印實例對象的名字時報錯,究其根本,我們可以找到,是在class stu類初始化方法中,對名稱和年齡的復制表示方式有所不同.
值得一提的是,在python中屬性和方法,在其變量標識符前加上"__"就表示私有,反之,就是公有.
私有和公有的具體意思就是,在別人調用你的對象時,你可以隱藏部分屬性或方法,這樣別人是無法使用的,要知道在多人項目開發中,每個開發人員是不可能細致的查看調用別人對象具體的屬性和方法,一時浪費時間,二是不一定能看懂,開發人員更多的是通過調用別人對象的方法來進行操作,就比如:
list_num = list(34, 94, 27, 49, 36)
list_num.reverse()
在這兩行代碼只是進行簡單的示范,第一句我們是實例化了一個列表對象,第二句話我們是調用了其方法.我們都知道reverse()這個函數是對列表內的元素進行反轉,可是你並不知道的是它具體使用了什么算法進行反轉,你所知道的只是reverse()這個函數能夠對列表元素反轉,這就是體現了其封裝的特性.
學過java的同學一定知道,java中有get和set方法,在此我列舉一下.
#test2.py class stu(): def __init__(self, name, age, score): self.__name = name self.__age = age self.__score = score def getName(self): return self.__name def getAge(self): return self.__age def getScore(self): return self.__score def setName(self, name): self.__name = name def setName(self, age): self.__age = age def setName(self, score): self.__score = score
初次接觸的同學可能認為這很麻煩,但其實並不是,這體現的就是對私有屬性的封裝,別人想獲取實例化對象的屬性時是無法直接通過私有變量來訪問的,只能通過get方法獲取對應的值,同樣只能通過set方法去更改值.
舉個例子,在去銀行取錢的時候,你通常的做法是,把錢放到ATM機里,再由ATM機將錢存放到錢庫里,一般來講是這個情況,不用深究.但是,你不可以直接越過錢庫的安全門,然后把錢放到錢庫里,換成取錢也是這個情況,取錢的時候是ATM機先從錢庫中取到錢,然后再把錢交給你,你是不可以直接從錢庫中拿錢,那樣做是不合法的.
而面向對象中私有屬性也是類似的情況,你是不能直接對屬性進行操作,必須通過第三者轉接這個屬性的值.
在面向對象中,class類中對私有和公有進行合理的划分,和提供較完善的封裝,這是一種好的編程思想和習慣.