【Python 面向對象】

Python 的面向對象編程(OOP)通過類(Class)和對象(Object)實現代碼結構化,支持封裝、繼承和多態三大特性。以下是系統化指南:


一、類與對象基礎

1. 定義類
class Dog:# 類屬性(所有實例共享)species = "Canis familiaris"# 構造方法(__init__是魔法方法)def __init__(self, name, age):self.name = name    # 實例屬性self.age = age# 實例方法def bark(self):return f"{self.name} says: Woof!"# 創建對象
my_dog = Dog("Buddy", 3)
print(my_dog.species)  # 輸出: Canis familiaris
2. 特殊方法(Magic Methods)
class Rectangle:def __init__(self, width, height):self.width = widthself.height = height# 計算面積def area(self):return self.width * self.height# 字符串表示(__str__用于用戶友好顯示)def __str__(self):return f"Rectangle({self.width}x{self.height})"# 運算符重載(實現加法)def __add__(self, other):return Rectangle(self.width + other.width,self.height + other.height)rect1 = Rectangle(2, 3)
rect2 = Rectangle(4, 5)
print(rect1 + rect2)  # 輸出: Rectangle(6x8)

二、繼承與方法重寫

1. 單繼承
class Animal:def __init__(self, name):self.name = namedef speak(self):raise NotImplementedError("子類必須實現此方法")class Dog(Animal):def speak(self):return f"{self.name} says: Woof!"class Cat(Animal):def speak(self):return f"{self.name} says: Meow!"animals = [Dog("Buddy"), Cat("Whiskers")]
for animal in animals:print(animal.speak())
2. 多重繼承
class Flyer:def fly(self):return "Flying!"class Swimmer:def swim(self):return "Swimming!"class Duck(Flyer, Swimmer):def __init__(self, name):self.name = nameduck = Duck("Donald")
print(duck.fly())  # 輸出: Flying!
print(duck.swim()) # 輸出: Swimming!
3. super() 函數
class Rectangle:def __init__(self, width, height):self.width = widthself.height = heightclass ColoredRectangle(Rectangle):def __init__(self, width, height, color):super().__init__(width, height)  # 調用父類構造方法self.color = color

三、多態與鴨子類型

1. 運行時多態
class Shape:def area(self):passclass Circle(Shape):def __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * self.radius ** 2class Square(Shape):def __init__(self, side):self.side = sidedef area(self):return self.side ** 2def print_area(shape):print(shape.area())print_area(Circle(5))  # 輸出: 78.5
print_area(Square(4))  # 輸出: 16
2. 鴨子類型(Duck Typing)
class Duck:def quack(self):print("Quack!")class FakeDuck:def quack(self):print("Silent quack")def make_quack(duck):duck.quack()make_quack(Duck())       # 輸出: Quack!
make_quack(FakeDuck())   # 輸出: Silent quack

四、封裝與訪問控制

1. 屬性控制
class BankAccount:def __init__(self, balance=0):self.__balance = balance  # 雙下劃線前綴實現名稱修飾@propertydef balance(self):return self.__balance@balance.setterdef balance(self, value):if value < 0:raise ValueError("余額不能為負")self.__balance = valueaccount = BankAccount(100)
account.balance = 200    # 允許修改
# account.balance = -50  # 拋出 ValueError
2. 描述符協議
class NonNegative:def __set_name__(self, owner, name):self.name = namedef __get__(self, instance, owner):return instance.__dict__[self.name]def __set__(self, instance, value):if value < 0:raise ValueError("值不能為負")instance.__dict__[self.name] = valueclass Product:price = NonNegative()stock = NonNegative()def __init__(self, price, stock):self.price = priceself.stock = stockproduct = Product(19.99, 100)
# product.price = -5  # 拋出 ValueError

五、高級特性

1. 元類(Metaclass)
class Singleton(type):_instances = {}def __call__(cls, *args, **kwargs):if cls not in cls._instances:cls._instances[cls] = super().__call__(*args, **kwargs)return cls._instances[cls]class Database(metaclass=Singleton):passdb1 = Database()
db2 = Database()
print(db1 is db2)  # 輸出: True
2. 抽象基類(ABC)
from abc import ABC, abstractmethodclass PaymentGateway(ABC):@abstractmethoddef process_payment(self, amount):passclass PayPal(PaymentGateway):def process_payment(self, amount):print(f"PayPal 處理支付: ${amount}")# class FakeGateway(PaymentGateway): pass  # 實例化會報錯

六、設計模式應用

1. 工廠模式
class ShapeFactory:@staticmethoddef create_shape(shape_type, **kwargs):shapes = {'circle': Circle,'square': Square}return shapes[shape_type](**kwargs)circle = ShapeFactory.create_shape('circle', radius=5)
2. 單例模式
class Database:_instance = Nonedef __new__(cls, *args, **kwargs):if not cls._instance:cls._instance = super().__new__(cls)cls._instance._initialized = Falsereturn cls._instancedef __init__(self):if not self._initialized:self.connect()self._initialized = Truedef connect(self):print("建立數據庫連接")

七、最佳實踐

  1. 組合優于繼承:優先使用對象組合而非類繼承
  2. 顯式優于隱式:避免過度依賴魔術方法
  3. 保持簡單:單個類職責不超過7個方法(參考SRP原則)
  4. 文檔字符串:為每個類和方法編寫docstring
  5. 類型注解(Python 3.5+):
    class Vector:def __init__(self, x: float, y: float):self.x = xself.y = y
    

掌握這些面向對象技術后,可進一步探索設計模式(如MVC、觀察者模式)和框架開發(如Django的類視圖)。建議通過實際項目(如開發電商系統、游戲引擎)深化理解。

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

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

相關文章

STM32F103_LL庫+寄存器學習筆記23 - PWM波形輸出及軟件方式調整周期與占空比

導言 脈寬調制&#xff08;PWM&#xff09;是 STM32 定時器最常用的輸出模式之一&#xff0c;廣泛應用于電機驅動、LED 調光、伺服控制和功率管理等場景。本篇文章將以 TIM5 為例&#xff0c;從寄存器層面深入剖析 PWM 輸出的原理與實現步驟。通過本篇博客&#xff0c;你不僅能…

堆(Heap)

1. 堆&#xff08;Heap&#xff09; 1.1. Python實現堆的插入、堆頂刪除和排序 class MaxHeap:def __init__(self):# 初始化空堆&#xff0c;使用列表表示self.heap []def insert(self, val):# 插入元素并執行上浮self.heap.append(val)self._sift_up(len(self.heap) - 1)de…

Spring類

BeanDefinition BeanDefinition表示Bean定義&#xff0c;BeanDefinition中存在很多屬性用來描述一個Bean的特點。比如&#xff1a; class&#xff0c;表示Bean類型scope&#xff0c;表示Bean作用域&#xff0c;單例或原型等lazyInit&#xff1a;表示Bean是否是懶加載initMeth…

在vue中this.$emit有哪些作用,事件監控具體含義,以及這些子組件能封裝哪些功能組件

this.$emit 的作用 this.$emit 的作用是觸發一個自定義事件&#xff0c;并將數據傳遞給父組件。父組件可以通過 v-on&#xff08;或 &#xff09;監聽這個事件&#xff0c;并在事件觸發時執行相應的處理函數。 this.content 的作用 this.content 是子組件的 props&#xff0…

前端流行框架Vue3教程:16. 組件事件配合`v-model`使用

組件事件配合v-model使用 如果是用戶輸入&#xff0c;我們希望在獲取數據的同時發送數據配合v-model 來使用&#xff0c;幫助理解組件間的通信和數據綁定。 &#x1f9e9; 第一步&#xff1a;創建子組件&#xff08;SearchComponent.vue&#xff09; 這個組件用于處理用戶的搜…

《Navicat之外的新選擇:實測支持國產數據庫的SQLynx核心功能解析》

數據庫工具生態的新變量 在數據庫管理工具領域&#xff0c;Navicat長期占據開發者心智。但隨著國產數據庫崛起和技術信創需求&#xff0c;開發者對工具的兼容性、輕量化和本土化適配提出了更高要求。近期體驗了一款名為SQLynx的國產數據庫管理工具&#xff08;麥聰旗下產品&am…

AgenticSeek開源的完全本地的 Manus AI。無需 API,享受一個自主代理,它可以思考、瀏覽 Web 和編碼,只需支付電費。

?一、軟件介紹 文末提供程序和源碼下載 AgenticSeek開源的完全本地的 Manus AI。無需 API&#xff0c;享受一個自主代理&#xff0c;它可以思考、瀏覽 Web 和編碼&#xff0c;只需支付電費。這款支持語音的 AI 助手是 Manus AI 的 100% 本地替代品 &#xff0c;可自主瀏覽網頁…

vue3.0的name屬性插件——vite-plugin-vue-setup-extend

安裝 這個由于是在開發環境下的一個插件 幫助我們支持name屬性 所以需要是-D npm i vite-plugin-vue-setup-extend -D在pasckjson中無法注釋每個插件的用處 可以在vscode中下載一個JsonComments這樣可以在json中添加注釋方便日后維護和查閱API 引入 在vite.config.js中 im…

Linux基礎 -- 在內存中使用chroot修復eMMC

Linux基礎 – 在內存中使用chroot修復eMMC 概述 本教程將介紹如何在Linux系統中&#xff0c;使用chroot在內存中構建一個臨時系統&#xff0c;并在不依賴原有系統的情況下修復eMMC&#xff08;如/dev/mmcblk2&#xff09;磁盤。該方法適用于嵌入式系統修復、磁盤清理以及離線…

人工智能、深度學習、機器學習的聯系與區別

定義 人工智能&#xff08;AI - Artificial Intelligence&#xff09; &#xff1a;是研究、開發用于模擬、延伸和擴展人的智能的理論、方法、技術及應用系統的一門新的技術科學。它旨在讓計算機能夠像人類一樣思考、學習和決策&#xff0c;涉及到諸如計算機視覺、自然語言處理…

web第二次課后作業--設計一個注冊登錄系統

一、頁面展示 登錄頁面 提交頁面 二、代碼 2.1 登錄頁面 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%><html> <head><meta http-equiv"Content-Type" content"…

電腦桌面便簽哪個好?2025年電腦免費用的便簽軟件推薦

我們都知道&#xff0c;一個優秀的桌面便簽軟件可以成為提高效率的得力助手。無論是記錄臨時靈感、管理待辦事項&#xff0c;還是提醒重要日程&#xff0c;合適的便簽工具都能讓您的數字生活更加有序。本文將為您介紹2025年最值得推薦的免費電腦桌面便簽軟件&#xff0c;從Wind…

【SPIN】用Promela驗證順序程序:從斷言到SPIN實戰(SPIN學習系列--2)

你寫了一段自認為“天衣無縫”的程序&#xff0c;但如何確保它真的沒有bug&#xff1f;靠手動測試&#xff1f;可能漏掉邊界情況&#xff1b;靠直覺&#xff1f;更不靠譜&#xff01;這時候&#xff0c;Promela SPIN組合就像程序的“顯微鏡”——用形式化驗證技術&#xff0c;…

LabVIEW中樣條插值實現及應用

在 LabVIEW 編程環境下&#xff0c;B - 樣條插值是處理數據擬合與曲線平滑的重要工具。它憑借靈活的特性和良好的數學性質&#xff0c;在眾多工程領域中發揮著關鍵作用&#xff0c;能夠高效地根據離散數據點生成平滑連續的曲線&#xff0c;為數據分析和處理提供了有力支持。 一…

【油藏地球物理正演軟件ColchisFM】基于數據驅動的油藏參數疊前地震反演研究進展

科吉思基于油藏地球物理參數的正演軟件ColchisFM&#xff0c;有機融合了巖石物理正演與地震正演&#xff0c;具有良好的適用性和便捷性&#xff0c;在業內已經廣泛使用。當用戶在做正演模擬的同時&#xff0c;自然會聯想到是否可以直接開展油藏地球物理參數反演呢&#xff1f;答…

互聯網大廠Java求職面試:AI與大模型集成的云原生架構設計

互聯網大廠Java求職面試&#xff1a;AI與大模型集成的云原生架構設計 引言 在現代互聯網企業中&#xff0c;AI與大模型技術的應用已經成為不可或缺的一部分。特別是在短視頻平臺、電商平臺和金融科技等領域&#xff0c;如何高效地將大模型集成到現有的云原生架構中是一個巨大…

Web GIS可視化地圖框架Leaflet、OpenLayers、Mapbox、Cesium、ArcGis for JavaScript

Mapbox、OpenLayers、Leaflet、ArcGIS for JavaScript和Cesium是五種常用的Web GIS地圖框架&#xff0c;它們各有優缺點&#xff0c;適用于不同的場景。還有常見的3d庫和高德地圖、百度地圖。 1. Mapbox 官網Mapbox Gl JS案列&#xff1a;https://docs.mapbox.com/mapbox-gl-…

專項智能練習(加強題型)-DA-02

2. 單選題 近年來&#xff0c;“斜杠青年”成為很多人的時尚追求。它指的是一群不再滿足“專一職業”生活方式&#xff0c;而選擇擁有多重職業和身份的多元生活人群。對此&#xff0c;有人認為&#xff0c;新產業新技術新業態不斷更迭&#xff0c;激烈的競爭促使青年人不斷進行…

使用gitbook 工具編寫接口文檔或博客

步驟一&#xff1a;在項目目錄中初始化一個 GitBook 項目 mkdir mybook && cd mybook git init npm init -y步驟二&#xff1a;添加書籍結構&#xff08;如 book.json, README.md&#xff09; echo "# 我的書" > README.md echo "{}" > bo…

Malformed input or input contains unmappable characters解決

JDK 17 文件上傳編碼異常解決方案技術文檔 1. 問題背景 在 JDK 17 環境下&#xff0c;文件上傳過程中可能拋出 Malformed input or input contains unmappable characters 錯誤。此問題通常由以下原因觸發&#xff1a; 文件路徑/名稱包含非 ASCII 字符&#xff08;如中文、日…