~~核心編程(六):面向對象——封裝~~


進擊のpython

*****

封裝


什么是封裝呢?

在前面是不是寫過這樣的代碼

class Dog:
    froom = "ch"

    def __init__(self, name, age, kind="erha"):
        self.blood = 100
        self.kind = kind
        self.age = age
        self.name = name

在當時我是不是說__ini__下放的是實例的私有變量?

其實這么說是不對的

這只能說是實例變量,或者是成員變量

當時只是為了讓你能夠好理解才那么表述的

這才算是私有屬性

玩過角色扮演類游戲的都知道

每個人物都是有基礎屬性且不可被修改的

很明顯,如果我還是像上面那么定義一個私有屬性的話

那我在外面就可以調用並且修改

class Dog:
    froom = "ch"

    def __init__(self, name, age, kind="erha"):
        self.blood = 100
        self.kind = kind
        self.age = age
        self.name = name

    pass


d = Dog("ponny", 3)

d.blood += 10
print(d.blood)

但是我不想在外面修改,因為這畢竟算是個“不可變的”參數

這就引出來我們要說的東西,封裝

封裝可以被認為是一個保護屏障,防止該類的代碼和數據被外部類定義的代碼隨機訪問。

要訪問該類的代碼和數據,必須通過嚴格的接口控制。

封裝最主要的功能在於我們能修改自己的實現代碼,而不用修改那些調用我們代碼的程序片段。

適當的封裝可以讓程式碼更容易理解與維護,也加強了代碼數據的安全性。


  • 如何封裝

    那怎么才能夠把100這個數據進行封裝呢?

    首先我們要先把他變成私有變量

    方法很簡單

    前面加上“__”

    就是這樣

    self.__blood = 100
    

    這樣設定完之后,在外面就不會被調用

    看到了吧,當實例化之后,調用方法的時候就沒有blood,更別說修改了,調都調不出來

    那封裝的目的是保護數據,而不是看不到或者拿不到數據

    所以封裝的第二步就是寫一個函數,讓私有變量參與進來

    class Dog:
        froom = "ch"
    
        def __init__(self, name, age, kind="erha"):
            self.kind = kind
            self.age = age
            self.name = name
            self.__boold = 100
    
        def fight(self):
            self.__boold -= 20
            print(f"受傷了,還剩{self.__boold}血量")
    
    
    d = Dog("ponny", 3)
    d.fight()
    
    受傷了,還剩80血量
    

    其實也可以看出來,雖然在外界能看到,但是拿到的其實是打印值(如果寫的是return,拿到的就是返回值)

    而這些值,你都沒有辦法在外面修改,就相當於這個值變成了 只讀 模式

    這就大大的加強了這個數據的安全性,對吧

    除非被函數操作修改,否則是不會被改變的

    以上的操作就是對blood這個屬性的封裝

    當然不止可以封裝屬性,也可以封裝函數

    操作方法一樣,在函數名前面加__

    同樣,在外面無法直接調用

    只能通過類里面的函數調用

    class Dog:
        froom = "ch"
    
        def __init__(self, name, age, kind="erha"):
            self.kind = kind
            self.age = age
            self.name = name
            self.__boold = 100
    
        def __adod(self):
            print("需要加血!!!!")
    
        def fight(self):
            self.__boold -= 20
            print(f"受傷了,還剩{self.__boold}血量")
            self.__adod()
    
    
    d = Dog("ponny", 3)
    d.fight()
    
    受傷了,還剩80血量
    需要加血!!!!
    

    看,函數(方法)也是可以被封裝起來的。(練幾下)


  • 不能修改?

    真不能修改?

    不是的,是可以修改的

    這種機制也並沒有真正意義上限制我們從外部直接訪問屬性,

    知道了類名和屬性名就可以拼出名字:類名_屬性

    然后就可以訪問了

    print(d._Dog__boold)
    
    100
    

    而且能拿到就能改

    d._Dog__boold = 500
    
    print(d._Dog__boold)
    
    500
    

    所以其實還是能改的


*有點東西*
*繼續深究*


免責聲明!

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



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