【python】OOP:Object-Oriented Programming

文章目錄

    • 1. 面向對象編程的核心概念
      • 1.1 類與對象的關系
      • 1.2 封裝(Encapsulation)
    • 2. 繼承與多態
      • 2.1 繼承機制
      • 2.2 多重繼承
      • 2.3 多態性
    • 3. 特殊方法與運算符重載
    • 4. 抽象類與接口
      • 4.1 抽象基類
    • 5. 組合與聚合
    • 6. 屬性管理
      • 6.1 使用property裝飾器
      • 6.2 描述符協議
    • 7. 元類與類裝飾器
      • 7.1 元類
      • 7.2 類裝飾器
    • 8. 設計模式實踐
      • 8.1 觀察者模式

1. 面向對象編程的核心概念

面向對象編程(OOP)是一種編程范式,它將數據和操作數據的方法封裝在一起,形成對象。Python作為一門多范式編程語言,對OOP提供了強大的支持。

1.1 類與對象的關系

類是對象的模板或藍圖,定義了對象的屬性和行為。對象是類的實例,是具體的數據實體。這種關系類似于建筑圖紙與實際建筑物的關系。

class Car:def __init__(self, brand, model):self.brand = brandself.model = modeldef start(self):return f"{self.brand} {self.model} is starting"# 創建對象實例
my_car = Car("Toyota", "Camry")
print(my_car.start())  # Toyota Camry is starting

1.2 封裝(Encapsulation)

封裝是將數據和方法綁定在一起,并限制對對象內部狀態的直接訪問。Python通過命名約定來實現封裝:

  • 公共屬性:直接訪問
  • 受保護屬性:以單下劃線開頭(_attribute)
  • 私有屬性:以雙下劃線開頭(__attribute)
class BankAccount:def __init__(self, balance):self._balance = balance  # 受保護屬性self.__account_number = "123456789"  # 私有屬性def deposit(self, amount):if amount > 0:self._balance += amountdef get_balance(self):return self._balancedef _internal_method(self):  # 受保護方法return "Internal processing"

2. 繼承與多態

2.1 繼承機制

繼承允許一個類獲得另一個類的屬性和方法,促進代碼重用并建立類之間的層次關系。

class Vehicle:def __init__(self, brand, year):self.brand = brandself.year = yeardef start(self):return "Vehicle is starting"def stop(self):return "Vehicle is stopping"class ElectricCar(Vehicle):def __init__(self, brand, year, battery_capacity):super().__init__(brand, year)  # 調用父類構造函數self.battery_capacity = battery_capacitydef charge(self):return f"Charging {self.brand} with {self.battery_capacity}kWh battery"def start(self):  # 方法重寫return f"Electric {self.brand} is silently starting"

2.2 多重繼承

Python支持多重繼承,但需要注意方法解析順序(MRO)。

class Flyable:def fly(self):return "Flying in the sky"class Swimmable:def swim(self):return "Swimming in water"class Duck(Flyable, Swimmable):def __init__(self, name):self.name = namedef quack(self):return f"{self.name} says quack!"# 查看方法解析順序
print(Duck.__mro__)

2.3 多態性

多態性允許不同類的對象對同一消息做出不同的響應,通過統一的接口處理不同類型的對象。

class Shape:def area(self):raise NotImplementedError("Subclass must implement area method")class Rectangle(Shape):def __init__(self, width, height):self.width = widthself.height = heightdef area(self):return self.width * self.heightclass Circle(Shape):def __init__(self, radius):self.radius = radiusdef area(self):return 3.14159 * self.radius ** 2# 多態性的體現
def print_area(shape):print(f"Area: {shape.area()}")shapes = [Rectangle(5, 3), Circle(4)]
for shape in shapes:print_area(shape)  # 同一接口,不同實現

3. 特殊方法與運算符重載

Python提供了豐富的特殊方法(魔術方法),允許類定義對象的行為。

class Vector:def __init__(self, x, y):self.x = xself.y = ydef __str__(self):return f"Vector({self.x}, {self.y})"def __repr__(self):return f"Vector({self.x!r}, {self.y!r})"def __add__(self, other):return Vector(self.x + other.x, self.y + other.y)def __eq__(self, other):return self.x == other.x and self.y == other.ydef __len__(self):return int((self.x ** 2 + self.y ** 2) ** 0.5)v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2)  # Vector(4, 6)
print(v1 == v2)  # False

4. 抽象類與接口

4.1 抽象基類

使用abc模塊創建抽象基類,強制子類實現特定方法。

from abc import ABC, abstractmethodclass Animal(ABC):@abstractmethoddef make_sound(self):pass@abstractmethoddef move(self):passdef sleep(self):  # 具體方法return "Animal is sleeping"class Dog(Animal):def make_sound(self):return "Woof!"def move(self):return "Dog is running"# Animal()  # 會報錯,不能實例化抽象類
dog = Dog()
print(dog.make_sound())  # Woof!

5. 組合與聚合

組合是一種"has-a"關系,表示整體與部分的強關聯。

class Engine:def __init__(self, horsepower):self.horsepower = horsepowerdef start(self):return f"Engine with {self.horsepower}HP is starting"class Car:def __init__(self, brand, engine):self.brand = brandself.engine = engine  # 組合關系def start(self):return f"{self.brand}: {self.engine.start()}"engine = Engine(200)
car = Car("BMW", engine)
print(car.start())  # BMW: Engine with 200HP is starting

6. 屬性管理

6.1 使用property裝飾器

class Temperature:def __init__(self, celsius=0):self._celsius = celsius@propertydef celsius(self):return self._celsius@celsius.setterdef celsius(self, value):if value < -273.15:raise ValueError("Temperature below absolute zero is not possible")self._celsius = value@propertydef fahrenheit(self):return (self._celsius * 9/5) + 32@fahrenheit.setterdef fahrenheit(self, value):self.celsius = (value - 32) * 5/9temp = Temperature(25)
print(temp.fahrenheit)  # 77.0
temp.fahrenheit = 86
print(temp.celsius)     # 30.0

6.2 描述符協議

描述符提供了更高級的屬性控制機制。

class Validator:def __init__(self, min_value=0, max_value=100):self.min_value = min_valueself.max_value = max_valuedef __set_name__(self, owner, name):self.name = namedef __get__(self, instance, owner):if instance is None:return selfreturn instance.__dict__[self.name]def __set__(self, instance, value):if not (self.min_value <= value <= self.max_value):raise ValueError(f"{self.name} must be between {self.min_value} and {self.max_value}")instance.__dict__[self.name] = valueclass Student:grade = Validator(0, 100)def __init__(self, name, grade):self.name = nameself.grade = grade  # 使用描述符驗證

7. 元類與類裝飾器

7.1 元類

元類是創建類的類,控制類的創建過程。

class SingletonMeta(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=SingletonMeta):def __init__(self):self.connection = "Connected to database"db1 = Database()
db2 = Database()
print(db1 is db2)  # True,單例模式

7.2 類裝飾器

類裝飾器提供了修改類行為的簡潔方式。

def add_logging(cls):original_init = cls.__init__def new_init(self, *args, **kwargs):print(f"Creating instance of {cls.__name__}")original_init(self, *args, **kwargs)cls.__init__ = new_initreturn cls@add_logging
class Product:def __init__(self, name, price):self.name = nameself.price = priceproduct = Product("Laptop", 999)  # 輸出: Creating instance of Product

8. 設計模式實踐

8.1 觀察者模式

class Subject:def __init__(self):self._observers = []self._state = Nonedef attach(self, observer):self._observers.append(observer)def detach(self, observer):self._observers.remove(observer)def notify(self):for observer in self._observers:observer.update(self._state)def set_state(self, state):self._state = stateself.notify()class Observer:def update(self, state):print(f"Observer received update: {state}")subject = Subject()
observer1 = Observer()
observer2 = Observer()subject.attach(observer1)
subject.attach(observer2)
subject.set_state("New State")  # 通知所有觀察者

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

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

相關文章

蒙特卡洛方法:隨機抽樣的藝術與科學

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 蒙特卡洛算法&#xff08;Monte Carlo Method&#xff09;是一類基于隨…

Linux基礎 -- UBI(**Unsorted Block Images**)

UBI&#xff08;Unsorted Block Images&#xff09;是 Linux 中為原始 NAND Flash 設計的一種 邏輯卷管理層&#xff0c;其核心作用是&#xff1a;在 NAND 閃存設備上提供 壞塊管理、擦寫均衡&#xff08;wear leveling&#xff09;和邏輯到物理地址映射等機制&#xff0c;為上…

線程相關函數

思維導圖 1. 創建一個分支線程&#xff0c;在主線程中拷貝文件的前一部分&#xff0c;主線程拷貝后一部分。 2.解讀代碼 info1 from child process_1 info1 from parent process3.解讀代碼&#xff0c;-打印多少次 14次

SeaTunnel 社區月報(5-6 月):全新功能上線、Bug 大掃除、Merge 之星是誰?

在 5 月和 6 月&#xff0c;SeaTunnel 社區迎來了一輪密集更新&#xff1a;2.3.11 正式發布&#xff0c;新增對 Databend、Elasticsearch 向量、HTTP 批量寫入、ClickHouse 多表寫入等多個連接器能力&#xff0c;全面提升了數據同步靈活性。同時&#xff0c;近 100 個修復與優化…

數學建模_非線性規劃

matlab求解調用示例 第二道例題建模 matlab求解 1.matlab只能處理min問題&#xff1a; max兩邊取負號變成min 2. > > >號變成 < < <&#xff1a;兩邊取負號 調用示例 第二道例題建模 目標函數取平方而不取絕對值 后面省略

【BurpSuite 2025最新版插件開發】基礎篇7:數據的持久化存儲

1 前言 歷史章節&#xff1a; 【BurpSuite 2025最新版插件開發】基礎篇1&#xff1a;環境搭建 【BurpSuite 2025最新版插件開發】基礎篇2&#xff1a;插件生命周期與核心接口 【BurpSuite 2025最新版插件開發】基礎篇3&#xff1a;請求攔截和修改簡單示例 【BurpSuite 202…

GPT-4 Turbo集成智能工作流,開啟自動化研究與知識管理新篇章!

目錄 一、系統架構設計二、核心模塊實現1. 智能數據采集引擎2. 自動化研究引擎3. 知識管理系統 三、智能工作流引擎四、關鍵技術實現1. 動態工作流引擎2. 知識圖譜構建 五、企業級部署方案1. 云原生架構2. Docker部署腳本 六、應用案例&#xff1a;藥物研發項目七、性能優化策略…

告別SQL卡頓與混亂!AI如何賦能實時計算?

在當今數據驅動的商業環境中&#xff0c;SQL作為與數據庫交互的核心語言&#xff0c;其編寫效率和質量直接影響著企業的數據決策速度和系統性能。然而&#xff0c;我們在長期的企業服務實踐中發現&#xff0c;數據庫開發人員普遍面臨以下痛點&#xff1a; SQL性能問題頻發&…

LeetCode算法(和中等打的有來有回)——盛最多水的容器

文章目錄 leetcode第11題&#xff1a;盛最多水的容器二次循環代碼 雙指針優化解析代碼 leetcode第11題&#xff1a;盛最多水的容器 二次循環 這道題比較容易想到的就是通過二次循環遍歷所有能盛的水的體積。 代碼 class Solution {public int maxArea(int[] height) {// 記錄…

Karmada 多集群服務發現

一、背景介紹 多集群架構下&#xff0c;不同 Kubernetes 集群間的服務如何互通是核心挑戰。Karmada 支持 Kubernetes Multi?cluster Service APIs&#xff08;MCS&#xff09;&#xff0c;通過 ServiceExport 和 ServiceImport 實現跨集群服務發現與調用&#xff0c;幫助多集…

macOS 26正式發布,全新Liquid Glass設計語言亮相

在全球科技愛好者翹首以盼的WWDC 2025開發者大會上&#xff0c;蘋果公司正式揭開了macOS 26系統的神秘面紗。此次系統更新最令人矚目的&#xff0c;當屬其采用的全新Liquid Glass設計語言&#xff0c;該設計不僅重塑了Mac的視覺風格&#xff0c;更為用戶帶來了一場前所未有的操…

網絡基礎(3)

網絡基礎&#xff08;3&#xff09; 有關進程 1&#xff09;進程是人在系統中的代表&#xff0c;只要把數據給進程&#xff0c;人就相當于拿到了數據 2&#xff09;數據傳輸到主機不是目的&#xff0c;而是手段。到達主機內部&#xff0c;再交給主機內的進程才是目的 上網的…

C語言專題:17.邏輯運算與三目運算符(按位邏輯運算、條件運算符)

? C語言中的邏輯運算符和三目運算符&#xff08;條件運算符&#xff09;是非常常見且基礎的操作符&#xff0c;它們分別用于布爾邏輯運算和簡化條件判斷的表達式。通過合理使用這些運算符&#xff0c;可以使代碼更加簡潔、清晰。本文將重點介紹邏輯運算符、三目運算符和按位邏…

【分布式 ID】一文詳解美團 Leaf

文章目錄 1. 前言2. 項目啟動示例 - MYSQL 和 Zookeepr2.1 Leaf-segment 模式2.2 Leaf-snowflake 模式 - 單節點2.3 Leaf-snowflake 模式 - 多節點 3. Leaf-segment 詳細講解4. Leaf-segment 源碼解析4.1 SegmentBuffer 號段緩存4.2 Segment 號段4.3 初始化號段服務 SegmentIDG…

互聯網大廠Java面試實錄:Spring Boot與微服務在電商場景中的應用

互聯網大廠Java面試實錄&#xff1a;Spring Boot與微服務在電商場景中的應用 面試場景 面試官&#xff1a;你好&#xff0c;謝飛機&#xff0c;歡迎參加我們的Java開發崗位面試。首先&#xff0c;能否簡單介紹一下你的技術背景&#xff1f; 謝飛機&#xff1a;嗨&#xff0c…

XILINX Ultrascale+ Kintex系列FPGA的架構

Xilinx&#xff08;現為AMD&#xff09;Kintex UltraScale系列FPGA是基于16nm FinFET工藝的高性能、中等成本的現場可編程門陣列&#xff0c;專為高帶寬、低功耗和成本效益的應用設計&#xff0c;廣泛用于5G通信、數據中心、視頻處理、航空航天等領域。以下詳細介紹Kintex Ultr…

騰訊云實名資質 “待補充后提交” 解決方法

目錄 一、引言二、為什么會出現 “待補充后提交” 狀態三、需要補充的具體材料3.1 營業執照3.2 法人身份證相關3.3 短信管理員資料3.4 合規使用承諾函 四、處理流程詳細步驟4.1 登錄騰訊云控制臺4.2 進入實名資質相關頁面4.3 上傳補充材料4.4 提交審核 五、注意事項5.1 材料規范…

8分鐘講完 Tomcat架構及工作原理

https://www.bilibili.com/video/BV1J3411k7Xc/?spm_id_from333.337.search-card.all.click&vd_source36145f3620bdf21c0f1a843352e603fb JavaWeb開發必看&#xff01;Tomcat架構及工作原理&#xff08;8分鐘&#xff09; 分闡明了Tomcat的工作原理。 一、Tomcat的核心架…

C盤爆滿元兇!WinSxS組件解密

C盤爆滿元兇!WinSxS組件解密 WinSxS是什么?核心功能與重要性目錄為何瘋狂膨脹?安全清理權威指南優先使用微軟官方工具:DISM工具清理效果與性能影響重要風險提示總結C盤爆滿元兇!WinSxS組件解密你是否也遇到過: C盤空間頻頻告急,檢查發現WinSxS文件夾竟獨占數十GB空間?想…

畢業設計(啟智模塊化機器人的組裝與K5的使用

記錄一下 畢業設計的部分筆記 準備清空文件發到csdn做一個紀念0.0 物聯網畢業設計 機器的組裝與K5的使用 基礎文件的學習 首先安裝K5 和文件包中的JLink驅動 并且文件實例里的代碼必須加上x后綴否則 只能用K4 來打開 供電&#xff1a;整個系統都需要電池運轉 build 存放…