python面向對象編程詳解

????????面向對象編程(OOP)是一種以對象為核心的編程范式。Python全面支持OOP,主要包含以下核心概念:

一、類與對象

1.類(Class)

類是創建對象的模板或藍圖,它定義了對象的屬性和方法。

class Dog:# 類屬性(所有實例共享)species = "Canis familiaris"# 初始化方法(構造對象)def __init__(self, name, age):# 實例屬性(每個對象獨立)self.name = nameself.age = age# 實例方法def bark(self):return f"{self.name} says Woof!"

2.對象(Object)

對象是類的實例,具有類定義的屬性和方法。

my_dog = Dog("Buddy", 3)
print(my_dog.bark()) ?# 輸出: Buddy says Woof!

二、三大核心特性

1.封裝(Encapsulation)

????????封裝是將數據(屬性)和操作數據的方法(行為)綁定在一起,并隱藏內部實現細節,只對外提供必要的接口。Python通過私有屬性和私有方法實現封裝。

class BankAccount:def __init__(self, balance=0):self.__balance = balance  # 私有屬性def deposit(self, amount):if amount > 0:self.__balance += amountreturn Truereturn Falsedef withdraw(self, amount):if 0 < amount <= self.__balance:self.__balance -= amountreturn Truereturn Falsedef get_balance(self):  # 提供獲取余額的方法return self.__balanceaccount = BankAccount(100)
account.deposit(50)
print(account.get_balance())  # 輸出: 150
# print(account.__balance)  # 報錯,無法直接訪問私有屬性

2.繼承(Inheritance)

繼承允許一個類(子類)繼承另一個類(父類)的屬性和方法,實現代碼的重用和擴展。

class Animal:def __init__(self, name):self.name = namedef speak(self):raise NotImplementedError("Subclass must implement abstract method")class Dog(Animal):def speak(self):return f"{self.name} says woof!"class Cat(Animal):def speak(self):return f"{self.name} says meow!"dog = Dog("Buddy")
cat = Cat("Whiskers")
print(dog.speak())  # 輸出: Buddy says woof!
print(cat.speak())  # 輸出: Whiskers says meow!

3.多態(Polymorphism)

????????多態是指同一個方法調用在不同對象上產生不同的行為。在Python中,多態通過繼承和方法重寫實現。

# 繼續使用上面的Animal、Dog和Cat類def animal_sound(animal):print(animal.speak())animals = [Dog("Buddy"), Cat("Whiskers")]
for animal in animals:animal_sound(animal)  # 分別輸出: Buddy says woof! 和 Whiskers says meow!

三、類成員詳解

????????類成員是面向對象編程的核心概念,Python中的類成員主要分為三類:屬性方法特殊成員。下面詳細解析各類成員的特性和用法:

1.屬性(Attributes)

類型定義方式訪問方式特點示例
實例屬性self.attr = valueobj.attr每個對象獨立self.name = "Alice"
類屬性類內部直接定義Class.attr所有實例共享species = "Human"
保護屬性_attr(單下劃線前綴)obj._attr約定私有,可訪問self._id = 123
私有屬性__attr(雙下劃線前綴)obj._Class__attr名稱修飾,強私有self.__password = "***"

?(1).類屬性

類屬性是屬于類的,所有對象共享該屬性。

class Circle:# 類屬性pi = 3.14159def __init__(self, radius):self.radius = radiusdef area(self):return Circle.pi * self.radius ** 2circle1 = Circle(5)
circle2 = Circle(10)print(circle1.area())  # 輸出: 78.53975
print(circle2.area())  # 輸出: 314.159

(2).實例屬性

實例屬性是屬于對象的,每個對象可以有不同的屬性值。

class Dog:def __init__(self, name, breed):# 實例屬性self.name = nameself.breed = breeddog1 = Dog("Buddy", "Golden Retriever")
dog2 = Dog("Max", "German Shepherd")print(dog1.name)  # 輸出: Buddy
print(dog2.breed) # 輸出: German Shepherd

?綜合案例:

class User:# 類屬性(所有用戶共享)platform = "WebApp"def __init__(self, name):# 實例屬性(每個用戶獨立)self.name = name# 保護屬性(約定私有)self._session_id = id(self)# 私有屬性(強私有)self.__password = "default"# 訪問示例
u = User("Alice")
print(u.platform)        # 類屬性 → "WebApp"
print(u.name)            # 實例屬性 → "Alice"
print(u._session_id)     # 保護屬性 → 123456
print(u.__password)      # 報錯!AttributeError
print(u._User__password) # 私有屬性 → "default"(不推薦)

2.方法(Methods)

類型定義方式調用方式特點參數要求
實例方法def method(self, ...):obj.method()可訪問實例/類屬性必須包含self
類方法@classmethodClass.method()操作類屬性,創建工廠方法必須包含cls
靜態方法@staticmethodClass.method()功能獨立,無狀態依賴無特殊參數

(1). 實例方法

實例方法是屬于對象的方法,第一個參數通常是?self,用于引用對象本身。

class Rectangle:def __init__(self, length, width):self.length = lengthself.width = width# 實例方法def area(self):return self.length * self.widthrect = Rectangle(5, 10)
print(rect.area())  # 輸出: 50

(2).類方法

????????類方法是屬于類的方法,使用?@classmethod?裝飾器定義,第一個參數通常是?cls,用于引用類本身。

class Pizza:def __init__(self, radius, ingredients):self.radius = radiusself.ingredients = ingredients@classmethoddef margherita(cls):return cls(12, ["tomato sauce", "mozzarella", "basil"])@classmethoddef pepperoni(cls):return cls(14, ["tomato sauce", "mozzarella", "pepperoni"])pizza1 = Pizza.margherita()
pizza2 = Pizza.pepperoni()print(pizza1.ingredients)  # 輸出: ['tomato sauce', 'mozzarella', 'basil']
print(pizza2.radius)       # 輸出: 14

(3).靜態方法

靜態方法是屬于類的方法,使用?@staticmethod?裝飾器定義,不需要?self?或?cls?參數。

class Math:@staticmethoddef add(a, b):return a + bresult = Math.add(3, 5)
print(result)  # 輸出: 8

綜合案例:?

class Calculator:# 類屬性PI = 3.14159# 實例方法def add(self, a, b):return a + b# 類方法@classmethoddef circle_area(cls, radius):return cls.PI * radius ** 2# 靜態方法@staticmethoddef is_even(num):return num % 2 == 0# 調用示例
calc = Calculator()
calc.add(2, 3)             # 實例方法 → 5
Calculator.circle_area(2)   # 類方法 → 12.56636
Calculator.is_even(7)       # 靜態方法 → False

3.特殊成員(魔術方法)

????????魔術方法(Magic Methods)是 Python 面向對象編程的核心特性,它們以雙下劃線開頭和結尾(如?__init__),用于定義類的特殊行為。這些方法會在特定操作發生時自動調用,讓自定義類擁有類似內置類型的行為。

類別常用方法觸發場景
對象生命周期__new__,?__init__,?__del__創建、初始化、銷毀對象
字符串表示__str__,?__repr__,?__format__print(),?str(),?format()
運算符重載__add__,?__sub__,?__mul__,?__eq__,?__lt__?等+,?-,?*,?==,?<?等操作
容器行為__len__,?__getitem__,?__setitem__,?__contains__,?__iter__len(),?[],?in,?for循環
屬性訪問__getattr__,?__getattribute__,?__setattr__,?__delattr__屬性訪問、設置、刪除
可調用對象__call__obj()?函數式調用
上下文管理__enter__,?__exit__with?語句
數值轉換__int__,?__float__,?__bool__int(),?float(),?bool()

1. 對象生命周期方法

class Lifecycle:def __new__(cls, *args, **kwargs):print("創建對象(內存分配)")return super().__new__(cls)def __init__(self, name):print(f"初始化對象: {name}")self.name = namedef __del__(self):print(f"銷毀對象: {self.name}")obj = Lifecycle("Test")  # 輸出: 創建對象 → 初始化對象: Test
del obj                 # 輸出: 銷毀對象: Test

2. 字符串表示方法

class Person:def __init__(self, name, age):self.name = nameself.age = age# 用戶友好展示def __str__(self):return f"{self.name} ({self.age}歲)"# 開發者調試/重建對象def __repr__(self):return f"Person('{self.name}', {self.age})"# 格式化輸出def __format__(self, format_spec):if format_spec == 'short':return self.name[0].upper()return str(self)p = Person("張三", 30)
print(str(p))    # 張三 (30歲)
print(repr(p))   # Person('張三', 30)
print(f"{p:short}")  # 張

?其他不在一一展示

class Vector2D:def __init__(self, x, y):self.x = xself.y = y# 字符串表示(用戶友好)def __str__(self):return f"({self.x}, {self.y})"# 運算符重載(向量加法)def __add__(self, other):return Vector2D(self.x + other.x, self.y + other.y)# 長度定義(模長)def __len__(self):return int((self.x**2 + self.y**2)**0.5)v1 = Vector2D(3, 4)
v2 = Vector2D(1, 2)
print(v1)          # 觸發__str__ → (3, 4)
print(v1 + v2)     # 觸發__add__ → (4, 6)
print(len(v1))     # 觸發__len__ → 5

四、高級特性

1.屬性訪問控制

@property裝飾器實現屬性保護

class Temperature:def __init__(self, celsius):self._celsius = celsius  # 保護屬性@propertydef celsius(self):  # Getterreturn self._celsius@celsius.setterdef celsius(self, value):if value < -273.15:raise ValueError("Too cold")self._celsius = value

2.抽象基類(ABC)

定義接口規范

from abc import ABC, abstractmethodclass Animal(ABC):@abstractmethoddef speak(self):passclass Cat(Animal):def speak(self):  # 必須實現抽象方法return "Meow"

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

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

相關文章

快速入門Socket編程——封裝一套便捷的Socket編程——導論

快速入門Socket編程——封裝一套便捷的Socket編程——導論 前言 ? 這里是筆者打算做的Socket編程的第二部分&#xff0c;也就是核心的討論我們Socket編程本身。 導論 ? 我們知道&#xff0c;一個經典的服務器套接字的處理流程是如下的&#xff1a; 創建一個指定傳輸層和網絡層…

【Mermaid 離線工具】Mermaid 流程圖生成器 - 高清PNG輸出,一鍵生成專業級流程圖!

文章目錄 Mermaid 流程圖生成器(離線版本):高效繪圖,離線也能玩轉專業可視化 一、Mermaid:文本繪圖的 “魔法語法” 二、離線版生成器:功能與優勢解析 (一)離線可用,場景更靈活 (二)操作流程:簡單五步,產出專業圖表 (三)界面設計:簡潔直觀,降低使用門檻 三、應…

haproxy原理及實戰部署

一、負載均衡 負載均衡是網絡架構和分布式系統中至關重要的技術&#xff0c;其核心作用是將大量的并發請求或數據流量合理分配到多個服務器&#xff08;或其他資源節點&#xff09;上&#xff0c;從而解決單節點壓力過大、資源利用率低、系統穩定性差等問題。 作用1. 提高系統吞…

jwt 在net9.0中做身份認證

一、新建net9.0項目WebApplication1&#xff0c;安裝包 <ItemGroup><PackageReference Include"Microsoft.AspNetCore.Authentication.JwtBearer" Version"9.0.7" /><PackageReference Include"Swashbuckle.AspNetCore" Version&…

【機器學習深度學習】微調能改變模型“智商”嗎?——模型能力與知識的本質解析

目錄 前言 一、模型的“知識”與“能力”&#xff1a;兩種不同的智能 第一種&#xff1a;淺層知識&#xff08;記憶 模式識別&#xff09; 第二種&#xff1a;深層能力&#xff08;推理 理解&#xff09; 二、微調&#xff1a;改變的是“經歷”&#xff0c;不是“天賦”…

oracle數據庫表空間碎片整理

oracle數據庫表空間碎片整理 表空間碎片情況檢查 表空間碎片問題處理 收縮表 表空間手動整理 exp/imp導出再導入 移動表到新的表空間 表空間碎片情況檢查 對比表實際使用空間和數據文件占用空間: --實際數據占用空間 select tablespace_name,round(sum(bytes/1024/1024/1024…

為什么需要可重入鎖

在黑馬點評項目實戰中&#xff0c;提到了可重入鎖&#xff0c;然后我想到了是不是不同業務在同一線程內反復獲取同一把鎖。本文來討論一下為什么鎖需要可重入。一、可重入鎖的核心&#xff1a;“同一線程多次獲取同一把鎖”??可重入&#xff08;Reentrant&#xff09;?? 的…

【AI】聯網模式

【AI】聯網模式 文章目錄【AI】聯網模式1. 簡介2. 接入步驟2.1 引入依賴2.2 方法構建2.3 接口構建1. 簡介 在使用聯網模式之前&#xff0c;我們如果問起ai一些最近網絡上流傳的一些東西&#xff0c;它可能并不能準確的給你描述出來&#xff0c;因為它的知識庫更新時間可能停留…

第10篇:實戰驗收篇

&#x1f50d; 實戰演練&#xff1a;多條件房源查詢 需求描述 查找一套符合以下條件的房子&#xff1a; 預算&#xff1a;2000–3000元區域&#xff1a;天河區戶型&#xff1a;兩房 關鍵詞&#xff1a;多條件查詢 AND BETWEEN LIKE 組合運用&#x1f3ac; 開場白“聽起來不難&a…

深入解析YARN中的FairScheduler與CapacityScheduler:資源分配策略的核心區別

YARN資源調度器概述在Hadoop生態系統中&#xff0c;YARN&#xff08;Yet Another Resource Negotiator&#xff09;作為核心資源管理平臺&#xff0c;其架構設計將計算資源管理與作業調度解耦&#xff0c;形成了"全局資源管理器&#xff08;ResourceManager&#xff09;節…

基于Seata的微服務分布式事務實戰經驗分享

基于Seata的微服務分布式事務實戰經驗分享 1. 業務場景描述 在電商系統中&#xff0c;用戶下單會涉及多個微服務&#xff1a;訂單服務&#xff08;Order Service&#xff09;、庫存服務&#xff08;Inventory Service&#xff09;、賬戶服務&#xff08;Account Service&#x…

Linux庫——庫的制作和原理(2)_庫的原理

文章目錄庫的原理理解目標文件ELF文件讀取ELF的工具——readelfELF從形成到加載的輪廓ELF形成可執行文件ELF可執行的加載理解鏈接與加載靜態鏈接ELF加載和進程地址空間虛擬地址 & 邏輯地址重新理解進程地址空間動態鏈接和動態庫的加載進程如何找到動態庫多個進程之間如何共…

Redis C++客戶端——通用命令

目錄 代碼案例 get和set部分 exists部分 del部分 keys部分 expire部分 type部分 本篇文章主要是通過redis-plus-plus庫使用通用命令。 代碼案例 下面用一個代碼演示&#xff1a; #include <sw/redis/redis.h> #include <iostream> #include <vecto…

手機開啟16k Page Size

我買了一個pixel8的手機&#xff0c;系統是Android16,如下操作都是基于這個手機做的。 https://source.android.com/docs/core/architecture/16kb-page-size/16kb-developer-option?hlzh-cn#use_16kb_toggle 使用 16 KB 切換開關 按照開發者選項文檔中的指示啟用開發者選項。…

VLAN的劃分(基于華為eNSP)

VLAN的劃分 前言&#xff1a;為什么VLAN是現代網絡的“隱形骨架”&#xff1f; 當一臺辦公室電腦發送文件給隔壁工位的同事時&#xff0c;數據如何精準抵達目標而不“打擾”其他設備&#xff1f;當企業財務部的敏感數據在網絡中傳輸時&#xff0c;如何避免被其他部門的設備“窺…

從壓縮到加水印,如何實現一站式圖片處理

當你需要對大量圖片進行相同或相似的操作時&#xff08;例如壓縮、裁剪、調整尺寸、添加水印等&#xff09;&#xff0c;逐個處理會非常耗時。批量處理工具可以一次性處理數百張圖片&#xff0c;大大節省了時間。這是一款極致輕巧的圖片處理利器&#xff0c;體積僅有652KB&…

Pythong高級入門Day5

二、面向對象編程面向對象編程&#xff08;Object-Oriented Programming&#xff0c;簡稱OOP&#xff09;是一種通過組織對象來設計程序的編程方法。Python天生就是面向對象的模塊化編程。1. 初識類和對象示意圖&#xff1a;/-------> BYD E6(京A.88888) 實例&#xff0c;對…

C#其他知識點

接口類---interface什么是接口? 在接口當中一般我們認為接口中的成員都是抽象的。接口一般認為是功能的集合。在接口類當中定義的方法都是抽象象方法。(沒有方法體)接口一般我們認為它是一種標準,一種規范,一種約定。給子類或者是派生類制定規范,規定,標準。當子類繼承了該接口…

Maven 環境配置全攻略:從入門到實戰

一、Maven 簡介 Maven 是一個基于項目對象模型 (POM) 的項目管理工具&#xff0c;它可以通過一小段描述信息來管理項目的構建、報告和文檔。 除了強大的程序構建能力外&#xff0c;Maven 還提供了高級項目管理功能。其默認構建規則具有很高的可重用性&#xff0c;通常只需兩三…

現代 C++ 開發工作流(VSCode / Cursor)

? 推薦的現代 C 開發工作流&#xff08;含 VSCode / Cursor 插件配置&#xff09;&#x1f9f0; 一、環境要求 C 編譯器&#xff08;如 g 或 clang&#xff09;CMake&#xff08;建議 ≥ 3.16&#xff09;clangd&#xff08;建議 ≥ 14&#xff0c;最好用系統包管理器安裝&…