python3 面向對象之封裝


封裝是是面向的特點之一,同時這也是最重要的,對象可以沒有繼承,可以沒有多態,但是不能沒有封裝,沒有封裝的對象就不是一個合格的對象.

封裝內分為屬性方法,初次接觸的同學可能不太習慣,但是,不要緊.

你可以把屬性想象成一個人的名字,年齡等信息,通常都是名詞性質的,而方法想象成是一種行為,比如一個人吃飯,睡覺等,通常是具有動詞性質的.

而屬性和方法又有公有和私有的划分,何為公有何為私有?看下面的代碼.

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類中對私有和公有進行合理的划分,和提供較完善的封裝,這是一種好的編程思想和習慣.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM