進擊の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
所以其實還是能改的