Python基礎教學之四:面向對象編程——邁向更高級編程

Python基礎教學之四:面向對象編程——邁向更高級編程

一、面向對象編程概念

1. 類和對象

  • 定義:在面向對象編程(OOP)中,類是創建對象的模板,它定義了對象的屬性和方法。對象是類的實例,具體存在的實體,擁有狀態和行為。
  • 關系:類與對象的關系類似于藍圖與房屋的關系。類描述了對象應具有的屬性和能夠執行的方法,而對象則是這些屬性和方法的具體實現。
  • 作用域:類中定義的屬性和方法統稱為類的成員。這些成員有不同的訪問級別,如公開、私有等,決定了它們是否可以被類外部的代碼直接訪問。
  • 方法:類中的方法代表對象的可執行行為。特殊方法(如__init__)有特定的功能,普通方法則執行對象的行為。
  • 屬性:屬性是對象的狀態,可以是變量或可調用的對象。在類中,可以定義實例屬性和類屬性,分別屬于對象和類本身。
  • self:在類的方法中,第一個參數通常是self,指代調用該方法的對象本身。通過self可以訪問對象的屬性和其他方法。

2. 繼承

  • 概念:繼承是OOP的一個核心機制,允許新的類從現有的類繼承屬性和方法,促進代碼重用和邏輯清晰。
  • 父類與子類:在繼承關系中,被繼承的類稱為父類(基類),繼承其他類的類稱為子類(派生類)。子類繼承了父類的特征并可以擴展或覆蓋它們。
  • 重寫與擴展:子類可以重寫繼承的方法,以修改或擴展其功能。也可以通過super()函數調用父類的方法,在此基礎上添加額外的邏輯。
  • 多層繼承:Python支持多層繼承,即一個類可以繼承多個父類。這增加了靈活性,但也增加了復雜性。
  • 接口繼承與實現繼承:在接口繼承中,子類只繼承方法的簽名而不包括實現,實現繼承則是子類繼承方法的具體實現。
  • 菱形繼承問題:當子類從多個父類繼承時,可能出現祖父類的方法被調用多次的問題,這需要通過合適的繼承結構來解決。
  • 抽象類與接口:抽象類和接口是特殊的類,它們定義了一組方法,但本身不提供實現。子類必須實現這些方法才能成為具體的類。

3. 封裝

  • 原理:封裝是將數據和操作數據的方法組織在一起的過程,隱藏內部實現細節,只暴露必要的接口給外部。
  • 作用:封裝減少了類和模塊之間的依賴,提高了代碼的可讀性和易維護性。
  • 訪問控制:Python沒有嚴格的訪問控制機制,但通過命名約定(如使用下劃線前綴)來標識私有成員,限制直接訪問。
  • getter和setter:使用getter和setter方法來讀取和修改屬性值,可以在方法中加入邏輯驗證,保證數據的有效性和完整性。Getter and Setter in Python - GeeksforGeeks
  • 描述符:描述符是一種特殊的對象,可以實現屬性的getter和setter功能,用于高級屬性訪問控制。
  • 屬性注解:Python允許使用注解來標記屬性的類型,雖然這不直接影響封裝,但有助于代碼的文檔化和類型檢查。
  • 模塊化:封裝促進了代碼模塊化,使得各個模塊和類的職責單一,專注于完成特定任務,減少耦合。

二、類的創建和使用

1. 定義類

  • 使用class關鍵字定義類,后跟類名和冒號。
  • 類定義中包括屬性和方法。
  • class ClassName:<statement-1>...<statement-N>

2. 實例化對象

  • 使用類名后跟括號來創建類的實例(對象)。
  • 對象可訪問類中定義的屬性和方法。
  • #!/usr/bin/python3class Complex:def __init__(self, realpart, imagpart):self.r = realpartself.i = imagpart
    x = Complex(3.0, -4.5)
    print(x.r, x.i)   # 輸出結果:3.0 -4.5

3. 構造方法__init__

  • __init__方法用于初始化新創建的對象。
  • 當創建對象時自動調用,可設置初始屬性值。

三、繼承和多態

1. 繼承的實現

  • 通過在類定義時指定父類來實現繼承。
  • 子類可以繼承父類的屬性和方法。
class DerivedClassName(BaseClassName):<statement-1>...<statement-N>

2. 多態的概念

????????多態是面向對象編程中一個重要的概念,它描述了一個函數或方法能夠對不同類型參數進行操作的能力。這種能力使得程序更加靈活和可擴展,因為它允許相同的接口可以用于不同的數據類型。

  • 多態指不同對象對同一方法的不同實現。
  • 子類可以覆蓋或擴展父類的方法。

3. 重寫方法

  • 在子類中重新定義父類的方法,以改變其行為。
  • 使用super()函數調用父類的方法。
#!/usr/bin/python3class Parent:        # 定義父類def myMethod(self):print ('調用父類方法')class Child(Parent): # 定義子類def myMethod(self):print ('調用子類方法')c = Child()          # 子類實例
c.myMethod()         # 子類調用重寫方法
super(Child,c).myMethod() #用子類對象調用父類已被覆蓋的方法

四、實戰演示:設計面向對象程序

1. 模擬現實世界問題

  • 以設計一個圖書館管理系統為例,展示如何抽象出類和對象。
  • 創建BookMemberLibrarian等類。

2. 利用OOP特性解決問題

  • 使用繼承創建NovelTextbook類,它們都繼承自Book類。
  • 實現多態,如不同類型的書籍有不同的借閱規則。

3. 設計用戶界面

  • 演示如何為圖書館系統設計簡單的文本界面。
  • 通過創建LibrarySystem類,管理圖書和會員的交互。
class LibrarySystem:def __init__(self):self.books = {}  # key: book_id, value: book_titleself.members = {}  # key: member_id, value: member_nameself.borrowed_books = {}  # key: member_id, value: list of borrowed book_idsdef add_book(self, book_id, book_title):if book_id in self.books:print(f"Book '{book_title}' with ID {book_id} already exists.")else:self.books[book_id] = book_titleprint(f"Book '{book_title}' has been added with ID {book_id}.")def register_member(self, member_id, member_name):if member_id in self.members:print(f"Member '{member_name}' with ID {member_id} already registered.")else:self.members[member_id] = member_nameself.borrowed_books[member_id] = []print(f"Member '{member_name}' has been registered with ID {member_id}.")def borrow_book(self, member_id, book_id):if book_id not in self.books:print(f"Book with ID {book_id} does not exist.")elif member_id not in self.members:print(f"Member with ID {member_id} is not registered.")elif book_id in self.borrowed_books[member_id]:print(f"Member '{self.members[member_id]}' has already borrowed the book '{self.books[book_id]}' with ID {book_id}.")else:self.borrowed_books[member_id].append(book_id)print(f"Member '{self.members[member_id]}' has borrowed the book '{self.books[book_id]}' with ID {book_id}.")def return_book(self, member_id, book_id):if book_id not in self.books:print(f"Book with ID {book_id} does not exist.")elif member_id not in self.members:print(f"Member with ID {member_id} is not registered.")elif book_id not in self.borrowed_books[member_id]:print(f"Member '{self.members[member_id]}' did not borrow the book '{self.books[book_id]}' with ID {book_id}.")else:self.borrowed_books[member_id].remove(book_id)print(f"Member '{self.members[member_id]}' has returned the book '{self.books[book_id]}' with ID {book_id}.")def run(self):while True:print("\nWelcome to the Library System")print("1. Add a book")print("2. Register a member")print("3. Borrow a book")print("4. Return a book")print("5. Exit")choice = input("Enter your choice: ")if choice == "1":book_id = input("Enter book ID: ")book_title = input("Enter book title: ")self.add_book(book_id, book_title)elif choice == "2":member_id = input("Enter member ID: ")member_name = input("Enter member name: ")self.register_member(member_id, member_name)elif choice == "3":member_id = input("Enter member ID: ")book_id = input("Enter book ID: ")self.borrow_book(member_id, book_id)elif choice == "4":member_id = input("Enter member ID: ")book_id = input("Enter book ID: ")self.return_book(member_id, book_id)elif choice == "5":print("Exiting the Library System.")breakelse:print("Invalid choice. Please enter a number between 1 and 5.")# Create an instance of LibrarySystem and run it
library_system = LibrarySystem()
library_system.run()

五、總結

????????至此,我們深入探討了Python中的面向對象編程,學習了類和對象、繼承、封裝和多態等核心概念。通過實際案例,我們了解了如何運用這些概念解決實際問題,并體驗了編程的另一種范式。繼續前進,我們將探索Python的異常處理和文件操作,使程序更加健壯和實用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43936.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43936.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43936.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

socket編程(1)

socket編程 1. 預備知識點1.1 網絡字節序1.2 ip地址轉換函數1.3 sockaddr數據結構 最后 1. 預備知識點 1.1 網絡字節序 多字節數據有大端和小端之分&#xff0c;網絡數據流采用大端字節序&#xff0c;如果主機采用的是小端字節序&#xff0c;那么需要轉換。 大端&#xff1a…

ffmpeg和imagemagick制作gif動圖

from: https://blog.csdn.net/hufang360/article/details/107291163?ops_request_misc%257B%2522request%255Fid%2522%253A%2522167876076516800186587476%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id167876076516800186587476&biz_i…

【JavaScript 報錯】未捕獲的范圍錯誤:Uncaught RangeError

&#x1f525; 個人主頁&#xff1a;空白詩 文章目錄 一、錯誤原因分析1. 遞歸調用次數過多2. 數組長度超出限制3. 數值超出允許范圍 二、解決方案1. 限制遞歸深度2. 控制數組長度3. 檢查數值范圍 三、實例講解四、總結 Uncaught RangeError 是JavaScript中常見的一種錯誤&…

347. 前 K 個高頻元素(中等)

347. 前 K 個高頻元素 1. 題目描述2.詳細題解3.代碼實現3.1 Python3.2 Java 1. 題目描述 題目中轉&#xff1a;347. 前 K 個高頻元素 2.詳細題解 尋找出現頻率前 k k k高的元素&#xff0c;因此需要先統計各個元素出現的次數&#xff0c;該步驟時間復雜度為 O ( n ) O(n) O(n)…

柔性接觸力學及其建模仿真方法

柔性接觸力學是研究柔性體&#xff08;如柔性機器人、柔性結構等&#xff09;在接觸過程中產生的力學效應和相互作用的學科。它涉及到接觸力的計算、接觸變形的分析以及接觸過程中的能量轉換等多個方面。由于柔性體具有變形能力&#xff0c;其接觸過程往往比剛性體接觸更為復雜…

Transformer學習過程中常見的問題與解決方案 - Transformer教程

在機器學習領域&#xff0c;Transformer模型已經成為了處理自然語言處理&#xff08;NLP&#xff09;任務的主流工具。然而&#xff0c;在學習和使用Transformer的過程中&#xff0c;很多人會遇到各種各樣的問題。今天我們就來聊一聊Transformer學習過程中常見的問題以及對應的…

C++模板總結

文章目錄 寫在前面1. 函數模板1.1 函數模板的概念1.2 函數模板的原理1.3 函數模板的實例化1.4 函數模板的實例化模板參數的匹配原則 2. 類模板3. 非類型模板參數4. 模板的特化4.1 概念4.2 函數模板特化4.3 類模板特化 5. 模板分離編譯6. 總結 寫在前面 進入C以后&#xff0c;C…

智能小車——初步想法

需要參考輪趣的智能小車自己搭建一臺智能機器人&#xff0c;這里從底層控制開始逐步搭建。 控制模式 之后要自行搭建智能小車&#xff0c;所以將輪趣的底盤代碼進行學習&#xff0c;根據開發手冊先大致過一遍需要的內容。 有做很多個控制方法&#xff0c;包括了手柄、串口、…

MySQL中的JOIN、LEFT JOIN、RIGHT JOIN講解

在 MySQL 中&#xff0c;JOIN 是一種非常強大的功能&#xff0c;它允許你將兩個或多個表中的行結合起來&#xff0c;基于兩個表之間的共同字段。這種操作在數據庫查詢中非常常見&#xff0c;特別是在處理關系型數據庫時。下面我將分別解釋 JOIN、LEFT JOIN&#xff08;也稱為 L…

uin-app微信小程序自定義tabBar底部菜單實現簡單示例(工作筆記)

在微信小程序中實現自定義 tabBar 可以為你的應用提供更加靈活和個性化的底部導航菜單。由于微信小程序的官方 tabBar 配置功能有限&#xff0c;自定義 tabBar 成為了很多開發者實現復雜底部導航的選擇。以下是一個簡單的示例&#xff0c;說明如何在小程序中實現自定義 tabBar。…

Linux下常見壓縮文件tar.xz、tar.bz2、tar.gz的區別和詳解

文章目錄 tar.xz tar.bz2 tar.gz 的區別三種文件的解壓方式tar.xz的解壓三種壓縮文件的創建方式 tar.xz tar.bz2 tar.gz 的區別 這三個文件擴展名都表示壓縮后的檔案文件&#xff0c;但它們使用不同的壓縮算法。 tar.xz: tar 代表 Tape Archive&#xff0c;它是一種將多個文件…

House holder reflections and Givens rotations

House holder reflections and Givens rotations Householder反射和Givens旋轉是兩種常見的線性代數方法&#xff0c;用于將一個矩陣分解為正交矩陣(Q)和上三角矩陣&#xff0c;即QR分解。它們在數值線性代數中非常重要&#xff0c;特別是在求解線性方程組和特征值問題中。以下…

【若依管理系統】注意事項

1.前端字段必填 rules: {sceneName: [{ required: true, message: "場景名稱不能為空", trigger: "blur" }],orderNum: [{ required: true, message: "顯示排序不能為空", trigger: "blur" }], }, 2.IDEA&#xff0c;默認以debug模式…

python | pyvips,一個神奇的 Python 庫

本文來源公眾號“python”&#xff0c;僅用于學術分享&#xff0c;侵權刪&#xff0c;干貨滿滿。 原文鏈接&#xff1a;pyvips&#xff0c;一個神奇的 Python 庫&#xff01; 大家好&#xff0c;今天為大家分享一個神奇的 Python 庫 - pyvips。 Github地址&#xff1a;https…

Agents 要點

一、Agents概念 人類是這個星球上最強大的 Agent。Agent是一個能感知并自主地采取行動的實體&#xff0c;這里的自主性極其關鍵&#xff0c;Agent要能夠實現設定的目標&#xff0c;其中包括具備學習和獲取知識的能力以提高自身性能。 關鍵點&#xff1a;感知環境、自主決策、具…

前端項目筆記經驗-001

做項目有一段時間了&#xff0c;利用下班或者零碎時間的功夫&#xff0c;想分享一些個人心得和感受。與君共勉。 前端應該具備的幾個能力&#xff1a; &#xff08;1&#xff09;準備假數據&#xff08;模擬數據&#xff09;的能力&#xff0c;因為后端有時候接口沒有準備好&…

element plus 實現跨頁面+跨tab欄多選

文章目錄 element plus 層面數據層面 菜鳥好久沒寫博客了&#xff0c;主要是沒遇見什么很難的問題&#xff0c;今天碰見了一個沒有思路的問題&#xff0c;解決后立馬來和大家伙分享了&#xff01; 菜鳥今天要實現一個需求&#xff0c;就是&#xff1a;實現跨頁面跨 tab欄 多選…

力學篤行(四)Qt 線程與信號槽

線程與信號槽 1. 主窗口&#xff08;MainWindow&#xff09;主線程2. 線程2.1 QThread2.2 QtConcurrent::run()2.3 thread 的調用方式 3. 信號槽3.1 connect3.2 元對象系統中注冊自定義數據類型 附錄一 信號槽機制與主線程進行通信示例 1. 主窗口&#xff08;MainWindow&#x…

MySQL聯合索引最左匹配原則

MySQL中的聯合索引(也叫組合索引)遵循最左匹配原則&#xff0c;即在創建聯合索引時&#xff0c;查詢條件必須從索引的最左邊開始&#xff0c;否則索引不會被使用。在聯合索引的情況下&#xff0c;數據是按照索引第一列排序&#xff0c;第一列數據相同時才會按照第二列排序。 例…

CVE-2024-27292:Docassemble任意文件讀取漏洞復現 [附POC]

文章目錄 CVE-2024-27292&#xff1a;Docassemble任意文件讀取漏洞復現 [附POC]0x01 前言0x02 漏洞描述0x03 影響版本0x04 漏洞環境0x05 漏洞復現1.訪問漏洞環境2.構造POC3.復現 0x06 修復建議 CVE-2024-27292&#xff1a;Docassemble任意文件讀取漏洞復現 [附POC] 0x01 前言 …