天天看點

【Python】筆記第四部分上:類和封裝

【Python】筆記第四部分

全系列導航見:Python教程整理

🌟概述

⭐️面向過程

  • 定義:分析出解決問題的步驟,然後逐漸實作。
  • 公式:程式 = 算法 + 資料結構
  • 優點:所有環節、細節自己掌控。
  • 缺點:考慮所有細節,工作量大。

⭐️面向對象

  • 定義:找出解決問題的人,然後配置設定職責。
  • 公式:程式 = 對象 + 互動
  • 優點
    1. 思想層面:
      • 可模拟現實情景,更接近于人類思維。
      • 有利于梳理歸納、分析解決問題。
    2. 技術層面:
      • 高複用:對重複的代碼進行封裝,提高開發效率。
      • 高擴充:增加新的功能,不修改以前的代碼。
      • 高維護:代碼可讀性好,邏輯清晰,結構規整。
  • 缺點:學習曲線陡峭。

🌟類和對象

  • 類:一個抽象的概念,即生活中的”類别”。
    • 資料成員:名詞類型的狀态。
    • 方法成員:動詞類型的行為。
  • 對象:類的具體執行個體,即歸屬于某個類别的”個體”。
  • 類是建立對象的”模闆”。
  • 類與類行為不同,對象與對象資料不同。

⭐️文法

✨定義類

class 類名:
	"""
		文檔說明
	"""
     def __init__(self,參數):
		self.執行個體變量 = 參數

	 方法成員           

複制

  • 類名所有單詞首字母大寫。
  • __init__

    也叫構造函數,建立對象時被調用,也可以省略。
  • self

    變量綁定的是被建立的對象,名稱可以随意,一般使用

    self

✨執行個體化對象

變量 = 類名(參數)           

複制

  • 變量存儲的是執行個體化後的對象位址。
  • 類名後面的參數按照構造函數的形參傳遞。

⭐️執行個體成員

✨執行個體變量

表示不同個體的不同資訊。

定義:對象.變量名
調用:對象.變量名            

複制

  • 首次通過對象指派為建立,再次指派為修改。
  • 通常在構造函數

    __init__

    中建立。
  • 每個對象存儲一份,通過對象位址通路。
  • 作用:描述某個對象的資料。
  • __dict__

    :對象的屬性,用于存儲自身執行個體變量的字典。因為這個,python允許在類外建立執行個體變量,叫做python的動态。
class AClass:
    pass

AClass.a = 2
print(AClass.a) # 2           

複制

注意:上面這種寫法知道就行,商業項目中幾乎不會用到。

✨執行個體方法

操作執行個體的變量,表達個體的行為。

# 定義
def 方法名稱(self, 參數):
        方法體           

複制

  • 至少有一個形參,第一個參數綁定調用這個方法的對象,一般命名為

    self

  • 無論建立多少對象,記憶體中的方法隻有一份,并且被所有對象共享。
# 調用
對象.方法名稱(參數)           

複制

  • 不建議通過類名通路執行個體方法,類名要通路類方法。
  • 作用:表示對象行為。
  • 隻有操作對象性質的行為才要定義在内部。

✨跨類調用

# 寫法1:直接建立對象
# 語義:老張每次建立一輛新車去
class Person:
    def __init__(self, name=""):
        self.name = name

    def go_to(self,position):
        print("去",position)
        car = Car()
        car.run()

class Car:
    def run(self):
        print("跑喽~")

lz = Person("老張")
lz.go_to("東北")            

複制

# 寫法2:在構造函數中建立對象
# 語義:老張開自己的車去
class Person:
    def __init__(self, name=""):
        self.name = name
        self.car = Car()

    def go_to(self,position):
        print("去",position)
        self.car.run()

class Car:
    def run(self):
        print("跑喽~")

lz = Person("老張")  
lz.go_to("東北")            

複制

# 方式3:通過參數傳遞
# 語義:老張用交通工具去
class Person:
    def __init__(self, name=""):
        self.name = name

    def go_to(self,vehicle,position):
        print("去",position)
        vehicle.run()

class Car:
    def run(self):
        print("跑喽~")

lz = Person("老張")
benz = Car()
lz.go_to(benz,"東北")           

複制

⭐️類成員

✨類變量

描述所有對象的共有的資料。

  • 随類的加載而加載
  • 存在優先于對象
  • 隻有一份,被所有對象共享。
  • 定義:在類中,方法外。
# 定義
class 類名:
     變量名 = 資料           

複制

# 調用
類名.變量名
# 不建議通過對象通路類變量,對象要通路的是執行個體變量。           

複制

✨類方法

用來操作類變量。

  • 至少有一個形參,第一個形參用于綁定類,一般命名為’cls’。
  • 使用@classmethod修飾的目的是調用類方法時可以隐式傳遞類,也就是自動傳遞類。
  • 類方法中不能通路執行個體成員,執行個體方法中可以通路類成員。
# 定義
  @classmethod
  def 方法名稱(cls,參數):
     方法體           

複制

# 調用
  類名.方法名(參數) 
  # 不建議通過對象通路類方法           

複制

⭐️靜态方法

  • 靜态方法不能通路執行個體成員和類成員
  • 使用@ staticmethod修飾的目的是該方法不需要隐式傳參數。
  • 作用:定義常用的工具函數。
@staticmethod
def 方法名稱(參數): # 這裡沒有
     	方法體           

複制

類名.方法名稱(參數) 
# 不建議通過對象通路靜态方法           

複制

🌟軟體架構

⭐️MVC架構

識别對象:界面視圖類 View,邏輯控制類 Controller,資料模型類 Model。命名的時候就用 xxxView,xxxController,xxxModel 就行。

V把一大堆輸入裝在M裡,去找C。

C把一大堆資料裝在M裡,去找V。

建立的系統中的 C 會賦予用 M 包好的資料一個

全球唯一辨別符

,一般就是

id

View 類的構造函數中執行個體化一個 Controller,意義是這個 View 的 Controller。

⭐️軟體封裝

軟體封裝後可以更容易使用,把便利留給他人,把麻煩留給自己。

  1. 封裝對象,把面向過程的代碼
  2. 封裝資料模型,添加

    Model

    對象。
  3. 封裝内部變量,使用

    __name

    的格式。
  4. 封裝對象程式,建立

    main

    函數,定義了類的使用流程。

入口代碼要盡量簡潔,啟動代碼最好就兩行,直接調用

main

⭐️補充

編碼時調用父,運作是執行子。說白了就是根據父的規範編碼,然後規範好的子同樣可以運作在這裡。