1. 程式人生 > >~~核心程式設計(六):面向物件——封裝~~

~~核心程式設計(六):面向物件——封裝~~

進擊の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

    所以其實還是能改的


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