Python類中方法種類與修飾符從基礎(chǔ)到實(shí)戰(zhàn)詳解
一、方法類型總覽
Python中的方法主要分為以下幾種:
方法分類: ┌───────────────┐ │ 實(shí)例方法 │ ← 操作實(shí)例屬性,第一個(gè)參數(shù)self ├───────────────┤ │ 類方法 │ ← 操作類屬性,@classmethod裝飾,第一個(gè)參數(shù)cls ├───────────────┤ │ 靜態(tài)方法 │ ← 不操作類或?qū)嵗龑傩?,@staticmethod裝飾 ├───────────────┤ │ 抽象方法 │ ← 必須由子類實(shí)現(xiàn),@abstractmethod裝飾 ├───────────────┤ │ 魔術(shù)方法 │ ← 雙下劃線開頭結(jié)尾,如__init__ └───────────────┘
二、各類方法詳解
1. 實(shí)例方法 (Instance Method)
特點(diǎn):
- 默認(rèn)類型的方法
- 第一個(gè)參數(shù)必須是
self
,指向?qū)嵗旧?/li> - 可以訪問(wèn)和修改實(shí)例屬性
- 可以訪問(wèn)類屬性
class MyClass: class_attr = "類屬性" def __init__(self, value): self.instance_attr = value # 實(shí)例屬性 def instance_method(self): return f"實(shí)例屬性: {self.instance_attr}, 類屬性: {self.class_attr}" obj = MyClass("實(shí)例值") print(obj.instance_method()) # 實(shí)例屬性: 實(shí)例值, 類屬性: 類屬性
2. 類方法 (Class Method)
特點(diǎn):
- 使用
@classmethod
裝飾器 - 第一個(gè)參數(shù)必須是
cls
,指向類本身 - 可以訪問(wèn)和修改類屬性
- 不能訪問(wèn)實(shí)例屬性
- 常用于創(chuàng)建工廠方法
class Pizza: base_price = 10 # 基礎(chǔ)價(jià)格 def __init__(self, toppings): self.toppings = toppings @classmethod def margherita(cls): return cls(["番茄", "芝士"]) # 創(chuàng)建特定類型的披薩 @classmethod def pepperoni(cls): return cls(["番茄", "芝士", "意大利辣香腸"]) @classmethod def update_base_price(cls, new_price): cls.base_price = new_price # 修改類屬性 # 使用類方法創(chuàng)建對(duì)象 margherita = Pizza.margherita() pepperoni = Pizza.pepperoni() print(margherita.toppings) # ['番茄', '芝士'] print(pepperoni.toppings) # ['番茄', '芝士', '意大利辣香腸'] # 修改類屬性 Pizza.update_base_price(12) print(Pizza.base_price) # 12
3. 靜態(tài)方法 (Static Method)
特點(diǎn):
- 使用
@staticmethod
裝飾器 - 不需要
self
或cls
參數(shù) - 不能訪問(wèn)類或?qū)嵗龑傩?/li>
- 與普通函數(shù)類似,但邏輯上屬于類
- 常用于工具函數(shù)
class MathUtils: @staticmethod def add(a, b): return a + b @staticmethod def circle_area(radius): return 3.14159 * radius ** 2 # 使用靜態(tài)方法 print(MathUtils.add(5, 3)) # 8 print(MathUtils.circle_area(2)) # 12.56636 # 也可以通過(guò)實(shí)例調(diào)用 utils = MathUtils() print(utils.add(10, 20)) # 30
4. 抽象方法 (Abstract Method)
特點(diǎn):
- 使用
@abstractmethod
裝飾器 - 必須從
abc.ABC
繼承 - 只定義接口不實(shí)現(xiàn),子類必須實(shí)現(xiàn)
- 用于定義抽象基類(ABC)
from abc import ABC, abstractmethod class Animal(ABC): @abstractmethod def make_sound(self): pass @abstractmethod def move(self): pass class Dog(Animal): def make_sound(self): return "汪汪!" def move(self): return "跑動(dòng)" # animal = Animal() # 報(bào)錯(cuò),不能實(shí)例化抽象類 dog = Dog() print(dog.make_sound()) # 汪汪! print(dog.move()) # 跑動(dòng)
5. 魔術(shù)方法 (Magic Method)
特點(diǎn):
- 雙下劃線開頭和結(jié)尾(
__method__
) - Python自動(dòng)調(diào)用,用于實(shí)現(xiàn)特殊行為
- 如
__init__
(初始化)、__str__
(字符串表示)等
class Vector: def __init__(self, x, y): self.x = x self.y = y def __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): """返回向量長(zhǎng)度(歐幾里得距離)""" return int((self.x**2 + self.y**2)**0.5) v1 = Vector(3, 4) v2 = Vector(5, 6) v3 = v1 + v2 # 調(diào)用__add__ print(v3) # Vector(8, 10) (調(diào)用__str__) print(len(v1)) # 5 (調(diào)用__len__)
三、方法修飾符對(duì)比表
特性 | 實(shí)例方法 | 類方法 | 靜態(tài)方法 | 抽象方法 |
---|---|---|---|---|
裝飾器 | 無(wú) | @classmethod | @staticmethod | @abstractmethod |
第一個(gè)參數(shù) | self(實(shí)例) | cls(類) | 無(wú) | self或cls |
訪問(wèn)實(shí)例屬性 | 可以 | 不可以 | 不可以 | 可以(需子類實(shí)現(xiàn)) |
訪問(wèn)類屬性 | 可以 | 可以 | 不可以 | 可以(需子類實(shí)現(xiàn)) |
調(diào)用方式 | 對(duì)象.方法() | 類.方法()或?qū)ο?方法() | 類.方法()或?qū)ο?方法() | 子類必須實(shí)現(xiàn) |
主要用途 | 操作實(shí)例狀態(tài) | 操作類狀態(tài)或工廠方法 | 工具函數(shù) | 定義接口規(guī)范 |
四、綜合案例:電商商品系統(tǒng)
讓我們通過(guò)一個(gè)電商商品系統(tǒng)的案例來(lái)綜合運(yùn)用各種方法類型:
from abc import ABC, abstractmethod from datetime import datetime class Product(ABC): """商品抽象基類""" tax_rate = 0.1 # 類屬性: 稅率 def __init__(self, name, price, quantity): self.name = name self.price = price self.quantity = quantity self.__id = self.__generate_id() # 私有屬性 def __generate_id(self): """私有方法: 生成商品ID""" timestamp = int(datetime.now().timestamp()) return f"PROD-{timestamp}" @property def id(self): """只讀屬性: 商品ID""" return self.__id @abstractmethod def display_info(self): """抽象方法: 顯示商品信息""" pass @classmethod def update_tax_rate(cls, new_rate): """類方法: 更新稅率""" cls.tax_rate = new_rate @staticmethod def calculate_discount(price, discount): """靜態(tài)方法: 計(jì)算折扣價(jià)""" return price * (1 - discount) def sell(self, quantity): """實(shí)例方法: 銷售商品""" if quantity <= self.quantity: self.quantity -= quantity total = quantity * self.price * (1 + self.tax_rate) return f"已售出 {quantity} 件 {self.name}, 總價(jià): {total:.2f}" return "庫(kù)存不足" class Book(Product): """具體商品類: 圖書""" def __init__(self, name, price, quantity, author): super().__init__(name, price, quantity) self.author = author def display_info(self): """實(shí)現(xiàn)抽象方法""" return (f"圖書: {self.name}\n" f"作者: {self.author}\n" f"價(jià)格: ¥{self.price:.2f}\n" f"庫(kù)存: {self.quantity}件\n" f"含稅價(jià): ¥{self.price * (1 + self.tax_rate):.2f}") class Electronics(Product): """具體商品類: 電子產(chǎn)品""" def __init__(self, name, price, quantity, warranty): super().__init__(name, price, quantity) self.warranty = warranty # 保修期(月) def display_info(self): """實(shí)現(xiàn)抽象方法""" return (f"電子產(chǎn)品: {self.name}\n" f"保修: {self.warranty}個(gè)月\n" f"價(jià)格: ¥{self.price:.2f}\n" f"庫(kù)存: {self.quantity}件\n" f"含稅價(jià): ¥{self.price * (1 + self.tax_rate):.2f}") # 使用示例 if __name__ == "__main__": # 修改稅率(類方法) Product.update_tax_rate(0.15) # 創(chuàng)建商品 book = Book("Python編程", 59.99, 100, "John Doe") phone = Electronics("智能手機(jī)", 2999.99, 50, 24) # 顯示商品信息(實(shí)例方法) print(book.display_info()) print("\n" + phone.display_info()) # 銷售商品(實(shí)例方法) print("\n" + book.sell(2)) print(phone.sell(1)) # 計(jì)算折扣(靜態(tài)方法) discounted_price = Product.calculate_discount(phone.price, 0.2) print(f"\n手機(jī)8折價(jià): ¥{discounted_price:.2f}") # 訪問(wèn)私有屬性(通過(guò)property) print(f"\n圖書ID: {book.id}") # print(book.__id) # 報(bào)錯(cuò),無(wú)法直接訪問(wèn)私有屬性
五、最佳實(shí)踐建議
合理使用方法類型:
- 需要訪問(wèn)實(shí)例狀態(tài) → 實(shí)例方法
- 需要操作類狀態(tài) → 類方法
- 獨(dú)立工具函數(shù) → 靜態(tài)方法
- 定義接口規(guī)范 → 抽象方法
命名約定:
- 普通方法:小寫加下劃線
calculate_total
- 私有方法:雙下劃線開頭
__internal_logic
- 魔術(shù)方法:雙下劃線開頭和結(jié)尾
__str__
封裝原則:
- 將不需要外部訪問(wèn)的方法設(shè)為私有
- 使用property控制屬性訪問(wèn)
- 通過(guò)方法暴露必要功能而非直接訪問(wèn)屬性
文檔說(shuō)明:
- 使用docstring說(shuō)明方法用途和參數(shù)
- 明確哪些方法是公開API,哪些是內(nèi)部實(shí)現(xiàn)
通過(guò)本文的學(xué)習(xí)和案例實(shí)踐,你應(yīng)該已經(jīng)掌握了Python中各種方法類型的特點(diǎn)和使用場(chǎng)景。記住,選擇合適的方法類型可以使你的代碼更加清晰、可維護(hù)和符合Python風(fēng)格。
以上就是Python類中方法種類與修飾符詳解的詳細(xì)內(nèi)容,更多關(guān)于Python方法種類與修飾符的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
pytorch 如何把圖像數(shù)據(jù)集進(jìn)行劃分成train,test和val
這篇文章主要介紹了pytorch 把圖像數(shù)據(jù)集進(jìn)行劃分成train,test和val的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05[機(jī)器視覺(jué)]使用python自動(dòng)識(shí)別驗(yàn)證碼詳解
這篇文章主要介紹了python自動(dòng)識(shí)別驗(yàn)證碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05python密碼學(xué)換位密碼及換位解密轉(zhuǎn)置加密教程
這篇文章主要為大家介紹了python密碼學(xué)換位密碼及換位解密轉(zhuǎn)置加密教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05python讀取mnist數(shù)據(jù)集方法案例詳解
這篇文章主要介紹了python讀取mnist數(shù)據(jù)集方法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09