Python類中方法種類與修飾符詳解:從基礎到實戰

文章目錄

  • Python類中方法種類與修飾符詳解:從基礎到實戰
    • 一、方法類型總覽
    • 二、各類方法詳解
      • 1. 實例方法 (Instance Method)
      • 2. 類方法 (Class Method)
      • 3. 靜態方法 (Static Method)
      • 4. 抽象方法 (Abstract Method)
      • 5. 魔術方法 (Magic Method)
    • 三、方法修飾符對比表
    • 四、綜合案例:電商商品系統
    • 五、最佳實踐建議

在這里插入圖片描述

Python類中方法種類與修飾符詳解:從基礎到實戰

在Python面向對象編程中,方法有不同的種類和修飾符,它們各自有著特定的用途和行為。本文將全面解析Python中的各種方法類型,并通過一個綜合案例幫助你徹底掌握這些概念。

一、方法類型總覽

Python中的方法主要分為以下幾種:

方法分類:┌───────────────┐│  實例方法     │ ← 操作實例屬性,第一個參數self├───────────────┤│  類方法       │ ← 操作類屬性,@classmethod裝飾,第一個參數cls├───────────────┤│  靜態方法     │ ← 不操作類或實例屬性,@staticmethod裝飾├───────────────┤│  抽象方法     │ ← 必須由子類實現,@abstractmethod裝飾├───────────────┤│  魔術方法     │ ← 雙下劃線開頭結尾,如__init__└───────────────┘

二、各類方法詳解

1. 實例方法 (Instance Method)

特點

  • 默認類型的方法
  • 第一個參數必須是self,指向實例本身
  • 可以訪問和修改實例屬性
  • 可以訪問類屬性
class MyClass:class_attr = "類屬性"def __init__(self, value):self.instance_attr = value  # 實例屬性def instance_method(self):return f"實例屬性: {self.instance_attr}, 類屬性: {self.class_attr}"obj = MyClass("實例值")
print(obj.instance_method())  # 實例屬性: 實例值, 類屬性: 類屬性

2. 類方法 (Class Method)

特點

  • 使用@classmethod裝飾器
  • 第一個參數必須是cls,指向類本身
  • 可以訪問和修改類屬性
  • 不能訪問實例屬性
  • 常用于創建工廠方法
class Pizza:base_price = 10  # 基礎價格def __init__(self, toppings):self.toppings = toppings@classmethoddef margherita(cls):return cls(["番茄", "芝士"])  # 創建特定類型的披薩@classmethoddef pepperoni(cls):return cls(["番茄", "芝士", "意大利辣香腸"])@classmethoddef update_base_price(cls, new_price):cls.base_price = new_price  # 修改類屬性# 使用類方法創建對象
margherita = Pizza.margherita()
pepperoni = Pizza.pepperoni()print(margherita.toppings)  # ['番茄', '芝士']
print(pepperoni.toppings)   # ['番茄', '芝士', '意大利辣香腸']# 修改類屬性
Pizza.update_base_price(12)
print(Pizza.base_price)  # 12

3. 靜態方法 (Static Method)

特點

  • 使用@staticmethod裝飾器
  • 不需要selfcls參數
  • 不能訪問類或實例屬性
  • 與普通函數類似,但邏輯上屬于類
  • 常用于工具函數
class MathUtils:@staticmethoddef add(a, b):return a + b@staticmethoddef circle_area(radius):return 3.14159 * radius ** 2# 使用靜態方法
print(MathUtils.add(5, 3))         # 8
print(MathUtils.circle_area(2))    # 12.56636# 也可以通過實例調用
utils = MathUtils()
print(utils.add(10, 20))          # 30

4. 抽象方法 (Abstract Method)

特點

  • 使用@abstractmethod裝飾器
  • 必須從abc.ABC繼承
  • 只定義接口不實現,子類必須實現
  • 用于定義抽象基類(ABC)
from abc import ABC, abstractmethodclass Animal(ABC):@abstractmethoddef make_sound(self):pass@abstractmethoddef move(self):passclass Dog(Animal):def make_sound(self):return "汪汪!"def move(self):return "跑動"# animal = Animal()  # 報錯,不能實例化抽象類
dog = Dog()
print(dog.make_sound())  # 汪汪!
print(dog.move())        # 跑動

5. 魔術方法 (Magic Method)

特點

  • 雙下劃線開頭和結尾(__method__)
  • Python自動調用,用于實現特殊行為
  • __init__(初始化)、__str__(字符串表示)等
class Vector:def __init__(self, x, y):self.x = xself.y = ydef __add__(self, other):"""向量加法"""return Vector(self.x + other.x, self.y + other.y)def __str__(self):return f"Vector({self.x}, {self.y})"def __len__(self):"""返回向量長度(歐幾里得距離)"""return int((self.x**2 + self.y**2)**0.5)v1 = Vector(3, 4)
v2 = Vector(5, 6)
v3 = v1 + v2  # 調用__add__print(v3)      # Vector(8, 10) (調用__str__)
print(len(v1)) # 5 (調用__len__)

三、方法修飾符對比表

特性實例方法類方法靜態方法抽象方法
裝飾器@classmethod@staticmethod@abstractmethod
第一個參數self(實例)cls(類)selfcls
訪問實例屬性可以不可以不可以可以(需子類實現)
訪問類屬性可以可以不可以可以(需子類實現)
調用方式對象.方法()類.方法()或對象.方法()類.方法()或對象.方法()子類必須實現
主要用途操作實例狀態操作類狀態或工廠方法工具函數定義接口規范

四、綜合案例:電商商品系統

讓我們通過一個電商商品系統的案例來綜合運用各種方法類型:

from abc import ABC, abstractmethod
from datetime import datetimeclass Product(ABC):"""商品抽象基類"""tax_rate = 0.1  # 類屬性: 稅率def __init__(self, name, price, quantity):self.name = nameself.price = priceself.quantity = quantityself.__id = self.__generate_id()  # 私有屬性def __generate_id(self):"""私有方法: 生成商品ID"""timestamp = int(datetime.now().timestamp())return f"PROD-{timestamp}"@propertydef id(self):"""只讀屬性: 商品ID"""return self.__id@abstractmethoddef display_info(self):"""抽象方法: 顯示商品信息"""pass@classmethoddef update_tax_rate(cls, new_rate):"""類方法: 更新稅率"""cls.tax_rate = new_rate@staticmethoddef calculate_discount(price, discount):"""靜態方法: 計算折扣價"""return price * (1 - discount)def sell(self, quantity):"""實例方法: 銷售商品"""if quantity <= self.quantity:self.quantity -= quantitytotal = quantity * self.price * (1 + self.tax_rate)return f"已售出 {quantity}{self.name}, 總價: {total:.2f}"return "庫存不足"class Book(Product):"""具體商品類: 圖書"""def __init__(self, name, price, quantity, author):super().__init__(name, price, quantity)self.author = authordef display_info(self):"""實現抽象方法"""return (f"圖書: {self.name}\n"f"作者: {self.author}\n"f"價格: ¥{self.price:.2f}\n"f"庫存: {self.quantity}件\n"f"含稅價: ¥{self.price * (1 + self.tax_rate):.2f}")class Electronics(Product):"""具體商品類: 電子產品"""def __init__(self, name, price, quantity, warranty):super().__init__(name, price, quantity)self.warranty = warranty  # 保修期(月)def display_info(self):"""實現抽象方法"""return (f"電子產品: {self.name}\n"f"保修: {self.warranty}個月\n"f"價格: ¥{self.price:.2f}\n"f"庫存: {self.quantity}件\n"f"含稅價: ¥{self.price * (1 + self.tax_rate):.2f}")# 使用示例
if __name__ == "__main__":# 修改稅率(類方法)Product.update_tax_rate(0.15)# 創建商品book = Book("Python編程", 59.99, 100, "John Doe")phone = Electronics("智能手機", 2999.99, 50, 24)# 顯示商品信息(實例方法)print(book.display_info())print("\n" + phone.display_info())# 銷售商品(實例方法)print("\n" + book.sell(2))print(phone.sell(1))# 計算折扣(靜態方法)discounted_price = Product.calculate_discount(phone.price, 0.2)print(f"\n手機8折價: ¥{discounted_price:.2f}")# 訪問私有屬性(通過property)print(f"\n圖書ID: {book.id}")# print(book.__id)  # 報錯,無法直接訪問私有屬性

五、最佳實踐建議

  1. 合理使用方法類型

    • 需要訪問實例狀態 → 實例方法
    • 需要操作類狀態 → 類方法
    • 獨立工具函數 → 靜態方法
    • 定義接口規范 → 抽象方法
  2. 命名約定

    • 普通方法:小寫加下劃線 calculate_total
    • 私有方法:雙下劃線開頭 __internal_logic
    • 魔術方法:雙下劃線開頭和結尾 __str__
  3. 封裝原則

    • 將不需要外部訪問的方法設為私有
    • 使用property控制屬性訪問
    • 通過方法暴露必要功能而非直接訪問屬性
  4. 文檔說明

    • 使用docstring說明方法用途和參數
    • 明確哪些方法是公開API,哪些是內部實現

通過本文的學習和案例實踐,你應該已經掌握了Python中各種方法類型的特點和使用場景。記住,選擇合適的方法類型可以使你的代碼更加清晰、可維護和符合Python風格。

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

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

相關文章

VSCode使用Jupyter完整指南配置機器學習環境

接下來開始機器學習部分 第一步配置環境&#xff1a; VSCode使用Jupyter完整指南 1. 安裝必要的擴展 打開VSCode&#xff0c;按 CtrlShiftX 打開擴展市場&#xff0c;搜索并安裝以下擴展&#xff1a; 必裝擴展&#xff1a; Python (Microsoft官方) - Python語言支持Jupyter (Mi…

數據結構與算法之美:拓撲排序

Hello大家好&#xff01;很高興我們又見面啦&#xff01;給生活添點passion&#xff0c;開始今天的編程之路&#xff01; 我的博客&#xff1a;<但凡. 我的專欄&#xff1a;《編程之路》、《數據結構與算法之美》、《C修煉之路》、《Linux修煉&#xff1a;終端之內 洞悉真理…

Ubuntu18.04 系統重裝記錄

Ubuntu18.04 系統重裝記錄 1 安裝google拼音 https://blog.csdn.net/weixin_44647619/article/details/144720947 你好&#xff01; 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章&#xff0c;了解一下Markdo…

Maven常用知識總結

Maven常用知識總結Maven 安裝與配置windows mvn安裝與配置IntelliJ IDEA 配置IntelliJ IDEA 配置系統mavenIntellij IDEA Maven使用IntelliJ IDEA 不能運行項目常見問題pom.xml 常用標簽講解parentgroupId artifactId versiondependencypropertiespluginpackagingdependencyMan…

PHP框架在大規模分布式系統的適用性如何?

曾幾何時&#xff0c;PHP被貼上“只適合小網站”的標簽。但在技術飛速發展的今天&#xff0c;PHP框架&#xff08;如Laravel、Symfony、Hyperf、Swoft等&#xff09; 早已脫胎換骨&#xff0c;勇敢地闖入了大規模分布式系統的疆域。今天&#xff0c;我們就來聊聊它的真實戰斗力…

DC-DC降壓轉換5.5V/3A高效率低靜態同步降壓轉換具有自適應關斷功能

概述&#xff1a;PC1032是一款高效且體積小巧的同步降壓轉換器&#xff0c;適用于低輸入電壓應用。它是緊湊設計的理想解決方案。其2.5V至5.5V的輸入電壓范圍適用于幾乎所有電池供電的應用。在中等至重負載范圍內&#xff0c;它以1.5MHz&#xff08;典型值&#xff09;的PWM模式…

min_25篩學習筆記+牛客多校02E

本來沒有學習這種較難的算法的想法的&#xff0c;因為比賽也做不到這種難度的題&#xff0c; 但是最近打牛客多校02&#xff0c;有一題要求 [1,n][1,n][1,n] 中素數的個數&#xff0c;我以為是像莫反一樣容斥&#xff0c;但是后面感覺不行。賽后知道是用 min_25 篩來求&#xf…

FunASR Paraformer-zh:高效中文端到端語音識別方案全解

項目簡介 FunASR 是阿里巴巴達摩院開源的端到端語音識別工具箱,集成了多種語音識別、語音活動檢測(VAD)、說話人識別等模塊。其中 paraformer-zh 和 paraformer-zh-streaming 是針對中文語音識別任務優化的端到端模型,分別適用于離線和流式場景。Paraformer 采用并行 Tran…

數據結構自學Day9: 二叉樹的遍歷

一、二叉樹的遍歷“遍歷”就是按某種規則 依次訪問樹中的每個節點&#xff0c;確保 每個節點都被訪問一次且只訪問一次遍歷&#xff1a;前序 中序 后序&#xff08;深度優先&#xff09;&#xff0c;層序&#xff08;廣度優先&#xff09;類型遍歷方法特點深度優先遍歷前序、中…

Leetcode(7.16)

求二叉樹最小深度class Solution {public int minDepth(TreeNode root) {if (root null) {return 0;}Queue<TreeNode> queue new LinkedList<>();queue.offer(root);int depth 0;while (!queue.isEmpty()) {depth;int levelSize queue.size();for (int i 0; i…

Go從入門到精通(25) - 一個簡單web項目-實現鏈路跟蹤

Go從入門到精通(25) 一個簡單web項目-實現鏈路跟蹤 文章目錄Go從入門到精通(25)前言為什么需要分布式鏈路跟蹤&#xff1f;go實現鏈路跟蹤搭建zipkin 服務安裝依賴添加tracing包&#xff0c;OpenTelemetry 和Zipkin在 Gin 中集成 OpenTelemetry 中間件log包添加獲取traceId方法…

2025年最新秋招java后端面試八股文+場景題

一、Java核心八股文&#xff08;2025年最新版&#xff09;1. Java基礎HashMap vs ConcurrentHashMapHashMap&#xff1a;非線程安全&#xff0c;JDK1.8后采用數組鏈表/紅黑樹&#xff0c;擴容時可能死循環&#xff08;JDK1.7&#xff09;。ConcurrentHashMap&#xff1a;JDK1.8…

esp32 sd卡

ref&#xff1a; platform io & arduino Boards — PlatformIO latest documentation https://github.com/espressif/arduino-esp32/blob/master/libraries/SD_MMC/README.md SD 卡實驗 | 極客俠GeeksMan GitHub - fabianoriccardi/ESPLogger: An Arduino library pro…

Java學習--------消息隊列的重復消費、消失與順序性的深度解析?

在 Java 分布式系統開發中&#xff0c;消息隊列的應用已十分普遍。但隨著業務規模擴大&#xff0c;消息的重復消費、意外消失、順序錯亂等問題逐漸成為系統穩定性的隱患。本文將從 Java 開發者的視角&#xff0c;深入分析這三大問題的產生原因、業務后果&#xff0c;并結合具體…

【Oracle】centos7離線靜默安裝oracle11g(p13390677_112040)

博文地址&#xff1a;https://blog.csdn.net/gitblog_06670/article/details/142569814 倉庫地址&#xff1a;https://gitcode.com/Open-source-documentation-tutorial/31eb1/?utm_sourcedocument_gitcode&indexbottom&typecard 參考安裝地址&#xff1a; 收費版&…

智能設備暢想

### 智能設備暢想 突然想到了一個好主意 因為最近在查無人機的相關資料&#xff08;很早之前就想搞個無人機玩玩但始終沒有買&#xff09; 在了解自組裝方面的內容時&#xff0c;和AI溝通了下 正好之前組裝的 小智AI 基本上已經完善了&#xff0c;也正在考慮其在其他方向拓展的…

SpringAI——ChatModel

我的前面一篇文章&#xff08;SpringAI——ChatClient配置與使用&#xff09;中講了ChatClient&#xff0c;它是一個構建于 ChatModel 之上的高層封裝&#xff0c;它提供了更豐富的對話交互能力。可以這么說ChatModel相當于發動機&#xff0c;ChatClient相當于一臺含有發動機、…

Zabbix監控K8S的PV信息詳細教程!

文將介紹如何使用Zabbix自定義鍵值腳本方式監控K8S的PV卷狀態等信息。 在Kubernetes (K8S) 中&#xff0c;PersistentVolume (PV) 是集群中的一個抽象層&#xff0c;它代表了底層存儲資源&#xff0c;例如網絡存儲系統&#xff08;如NFS、Ceph、GlusterFS等&#xff09;或本地存…

wx小程序原生開發使用高德地圖api

第一步&#xff1a;注冊高德地圖api的key第二步&#xff1a;下載amap-wx.js 放到項目的某個目錄第三步&#xff1a;配置app.json&#xff08;必須&#xff0c;因為需要定位功能&#xff0c;&#xff09;"requiredPrivateInfos": ["getLocation"],"per…

如何通過mac的前24bit,模糊確認是那一臺什么樣的設備

MAC Address Lookup - MAC/OUI/IAB/IEEE Vendor Manufacturer Search Wireshark ? Go Deep 上面這兩個網址提供了&#xff0c;正對mac 的前24位&#xff0c;查找對應的網絡設備廠商信息&#xff0c;可以讓我們在運維過程中模糊的判斷大約是什么型號的設備 使用macvendorloo…