ο缶幊痰幕A(chǔ)知識)
1. 什么是封裝封裝Encapsulation是面向?qū)ο缶幊蘋OP的三大核心特性之一另外兩個是繼承和多態(tài)。封裝的核心思想是將數(shù)據(jù)屬性和操作數(shù)據(jù)的方法方法捆綁在一起形成一個獨立的單元——類Class。通過封裝我們可以隱藏對象的內(nèi)部實現(xiàn)細節(jié)只對外暴露必要的接口從而提高代碼的安全性、可維護性和可重用性。2. 封裝的基本實現(xiàn)在 Python 中封裝主要通過類來實現(xiàn)。一個類可以包含屬性和方法并通過訪問控制來管理對內(nèi)部數(shù)據(jù)的訪問。2.1 定義類與實例屬性class Student: def __init__(self, name, age): # 實例屬性 self.name name self.age age def introduce(self): return f我叫{self.name}今年{self.age}歲。 創(chuàng)建對象 stu1 Student(張三, 18) print(stu1.introduce()) # 輸出我叫張三今年18歲。2.2 訪問控制公有、保護與私有Python 通過命名約定來實現(xiàn)不同級別的訪問控制公有成員Public普通命名如name、age可以在類的外部直接訪問。保護成員Protected以單下劃線開頭如_protected_var這是一種約定表示該成員僅供類內(nèi)部和子類使用但 Python 并不強制限制外部訪問。私有成員Private以雙下劃線開頭如__private_varPython 會進行名稱改寫Name Mangling使其在類外部難以直接訪問從而實現(xiàn)一定程度的保護。class BankAccount: def __init__(self, owner, balance): self.owner owner # 公有屬性 self._bank_name 某銀行 # 保護屬性 self.__balance balance # 私有屬性 def get_balance(self): # 通過公有方法訪問私有屬性 return self.__balance def deposit(self, amount): if amount gt; 0: self.__balance amount return True return False account BankAccount(李四, 1000) print(account.owner) # 正常訪問李四 print(account._bank_name) # 可以訪問但不建議某銀行 print(account.__balance) # 直接訪問會報錯AttributeError print(account.get_balance()) # 通過方法訪問10003. 封裝的優(yōu)點數(shù)據(jù)保護防止外部代碼隨意修改對象的內(nèi)部狀態(tài)確保數(shù)據(jù)的完整性和安全性。接口簡化用戶只需要知道如何使用類提供的公有方法無需了解內(nèi)部復雜的實現(xiàn)邏輯。代碼維護內(nèi)部實現(xiàn)的修改不會影響外部代碼的使用只要接口保持不變。模塊化將相關(guān)的數(shù)據(jù)和操作封裝在一起提高了代碼的模塊化程度。4. 屬性裝飾器更優(yōu)雅的封裝Python 提供了property、屬性名.setter和屬性名.deleter裝飾器可以讓我們以訪問屬性的語法來調(diào)用方法實現(xiàn)更精細的控制。class Rectangle: def __init__(self, width, height): self._width width self._height height property def width(self): 獲取寬度 return self._width width.setter def width(self, value): 設置寬度并進行合法性檢查 if value lt; 0: raise ValueError(寬度必須大于0) self._width value property def area(self): 計算面積只讀屬性 return self._width * self._height rect Rectangle(5, 3) print(rect.width) # 輸出5 rect.width 10 # 調(diào)用 setter 方法 print(rect.area) # 輸出30 rect.area 100 # 報錯area 是只讀屬性5.案例示例1使用turtle模塊結(jié)合類封裝以下功能 # 繪制圓形繪制矩形繪制三角形import turtle class ShapeDraw: def __init__(self, speed 3): self.t turtle.Turtle() self.t.speed(speed) self.screen turtle.Screen() def draw_circle(self, x, y, r, color black, pensize 1): self.t.up() self.t.goto(x, y - r) self.t.down() self.t.color(color) self.t.pensize(pensize) self.t.circle(r) def draw_jx(self, x ,y, width, heigth, color black, pensize 1): self.t.up() self.t.goto(x, y) self.t.down() self.t.color(color) self.t.pensize(pensize) for _ in range(2): self.t.forward(width) self.t.right(90) self.t.forward(heigth) self.t.right(90) def draw_triangel(self, x, y, length, color pink, pensize 2): self.t.up() self.t.goto(x, y) self.t.down() self.t.color(color) self.t.pensize(pensize) for _ in range(3): self.t.forward(length) self.t.right(120) def hide_turtle(self): self.t.hideturtle() def showturtle(self): self.t.showturtle() def show(self): # 新增保持窗口顯示 self.screen.mainloop() drawer ShapeDraw() drawer.draw_circle(150, 100, 50, red) drawer.draw_jx(-200, 200, 100, 150) drawer.draw_triangel(150, -150, 150, pink) drawer.hide_turtle() drawer.showturtle() drawer.show()運行結(jié)果示例2創(chuàng)建一個點類x,y 隨機兩個點求兩個點之間的距離import random class Points: def __init__(self, x, y): self.x x self.y y def get_x(self): return self.x def get_y(self): return self.y ps [(random.randint(1, 10),random.randint(1, 10)) for _ in range(2)] for p in ps: print(p) p1 Points(ps[0][0], ps[0][1]) p2 Points(ps[1][0], ps[1][1]) dis ((p1.get_x() - p2.get_x()) ** 2 (p1.get_y() - p2.get_y()) ** 2) ** 0.5 print(dis)運行結(jié)果示例3創(chuàng)建一個圓Circle類 # 為該類提供一個初始化方法用于初始化半徑 # 為該類提供兩個方法 # 方法一用 于求圓的面積方法二用于求圓的周長class Circle: def __init__(self, radius): self.radius radius def area(self): return self.radius * self.radius * 3.14 def c(self): return self.radius * 2 * 3.14 c1 Circle(1) print(c1.area()) print(c1.c())6. 封裝的實際應用場景6.1 數(shù)據(jù)驗證在設置屬性值時進行數(shù)據(jù)驗證確保數(shù)據(jù)的有效性。6.2 計算屬性將需要計算得到的值封裝為屬性對外提供統(tǒng)一的訪問接口。6.3 隱藏復雜實現(xiàn)將復雜的算法或數(shù)據(jù)處理過程封裝在類內(nèi)部對外提供簡單的調(diào)用方法。7. 總結(jié)封裝是 Python 面向?qū)ο缶幊痰幕Mㄟ^合理使用類、訪問控制和屬性裝飾器我們可以構(gòu)建出結(jié)構(gòu)清晰、安全可靠、易于維護的代碼。掌握封裝不僅有助于編寫更好的 Python 程序也是理解更高級設計模式的前提。在實際開發(fā)中建議將不需要對外暴露的屬性和方法設為私有。通過公有方法或?qū)傩匝b飾器來提供對內(nèi)部數(shù)據(jù)的受控訪問。保持類的職責單一避免創(chuàng)建過于龐大的類。