Python類(lèi)中方法種類(lèi)與修飾符從基礎(chǔ)到實(shí)戰(zhàn)詳解
一、方法類(lèi)型總覽
Python中的方法主要分為以下幾種:
方法分類(lèi): ┌───────────────┐ │ 實(shí)例方法 │ ← 操作實(shí)例屬性,第一個(gè)參數(shù)self ├───────────────┤ │ 類(lèi)方法 │ ← 操作類(lèi)屬性,@classmethod裝飾,第一個(gè)參數(shù)cls ├───────────────┤ │ 靜態(tài)方法 │ ← 不操作類(lèi)或?qū)嵗龑傩?,@staticmethod裝飾 ├───────────────┤ │ 抽象方法 │ ← 必須由子類(lèi)實(shí)現(xiàn),@abstractmethod裝飾 ├───────────────┤ │ 魔術(shù)方法 │ ← 雙下劃線開(kāi)頭結(jié)尾,如__init__ └───────────────┘
二、各類(lèi)方法詳解
1. 實(shí)例方法 (Instance Method)
特點(diǎn):
- 默認(rèn)類(lèi)型的方法
- 第一個(gè)參數(shù)必須是
self,指向?qū)嵗旧?/li> - 可以訪問(wèn)和修改實(shí)例屬性
- 可以訪問(wèn)類(lèi)屬性
class MyClass:
class_attr = "類(lèi)屬性"
def __init__(self, value):
self.instance_attr = value # 實(shí)例屬性
def instance_method(self):
return f"實(shí)例屬性: {self.instance_attr}, 類(lèi)屬性: {self.class_attr}"
obj = MyClass("實(shí)例值")
print(obj.instance_method()) # 實(shí)例屬性: 實(shí)例值, 類(lèi)屬性: 類(lèi)屬性
2. 類(lèi)方法 (Class Method)
特點(diǎn):
- 使用
@classmethod裝飾器 - 第一個(gè)參數(shù)必須是
cls,指向類(lèi)本身 - 可以訪問(wèn)和修改類(lèi)屬性
- 不能訪問(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)建特定類(lèi)型的披薩
@classmethod
def pepperoni(cls):
return cls(["番茄", "芝士", "意大利辣香腸"])
@classmethod
def update_base_price(cls, new_price):
cls.base_price = new_price # 修改類(lèi)屬性
# 使用類(lèi)方法創(chuàng)建對(duì)象
margherita = Pizza.margherita()
pepperoni = Pizza.pepperoni()
print(margherita.toppings) # ['番茄', '芝士']
print(pepperoni.toppings) # ['番茄', '芝士', '意大利辣香腸']
# 修改類(lèi)屬性
Pizza.update_base_price(12)
print(Pizza.base_price) # 12
3. 靜態(tài)方法 (Static Method)
特點(diǎn):
- 使用
@staticmethod裝飾器 - 不需要
self或cls參數(shù) - 不能訪問(wèn)類(lèi)或?qū)嵗龑傩?/li>
- 與普通函數(shù)類(lèi)似,但邏輯上屬于類(lèi)
- 常用于工具函數(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),子類(lèi)必須實(shí)現(xiàn)
- 用于定義抽象基類(lèi)(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í)例化抽象類(lèi)
dog = Dog()
print(dog.make_sound()) # 汪汪!
print(dog.move()) # 跑動(dòng)
5. 魔術(shù)方法 (Magic Method)
特點(diǎn):
- 雙下劃線開(kāi)頭和結(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í)例方法 | 類(lèi)方法 | 靜態(tài)方法 | 抽象方法 |
|---|---|---|---|---|
| 裝飾器 | 無(wú) | @classmethod | @staticmethod | @abstractmethod |
| 第一個(gè)參數(shù) | self(實(shí)例) | cls(類(lèi)) | 無(wú) | self或cls |
| 訪問(wèn)實(shí)例屬性 | 可以 | 不可以 | 不可以 | 可以(需子類(lèi)實(shí)現(xiàn)) |
| 訪問(wèn)類(lèi)屬性 | 可以 | 可以 | 不可以 | 可以(需子類(lèi)實(shí)現(xiàn)) |
| 調(diào)用方式 | 對(duì)象.方法() | 類(lèi).方法()或?qū)ο?方法() | 類(lèi).方法()或?qū)ο?方法() | 子類(lèi)必須實(shí)現(xiàn) |
| 主要用途 | 操作實(shí)例狀態(tài) | 操作類(lèi)狀態(tài)或工廠方法 | 工具函數(shù) | 定義接口規(guī)范 |
四、綜合案例:電商商品系統(tǒng)
讓我們通過(guò)一個(gè)電商商品系統(tǒng)的案例來(lái)綜合運(yùn)用各種方法類(lèi)型:
from abc import ABC, abstractmethod
from datetime import datetime
class Product(ABC):
"""商品抽象基類(lèi)"""
tax_rate = 0.1 # 類(lèi)屬性: 稅率
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):
"""類(lèi)方法: 更新稅率"""
cls.tax_rate = new_rate
@staticmethod
def calculate_discount(price, discount):
"""靜態(tài)方法: 計(jì)算折扣價(jià)"""
return price * (1 - discount)
def sell(self, quantity):
"""實(shí)例方法: 銷(xiāo)售商品"""
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):
"""具體商品類(lèi): 圖書(shū)"""
def __init__(self, name, price, quantity, author):
super().__init__(name, price, quantity)
self.author = author
def display_info(self):
"""實(shí)現(xiàn)抽象方法"""
return (f"圖書(shū): {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):
"""具體商品類(lèi): 電子產(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__":
# 修改稅率(類(lèi)方法)
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())
# 銷(xiāo)售商品(實(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圖書(shū)ID: {book.id}")
# print(book.__id) # 報(bào)錯(cuò),無(wú)法直接訪問(wèn)私有屬性
五、最佳實(shí)踐建議
合理使用方法類(lèi)型:
- 需要訪問(wèn)實(shí)例狀態(tài) → 實(shí)例方法
- 需要操作類(lèi)狀態(tài) → 類(lèi)方法
- 獨(dú)立工具函數(shù) → 靜態(tài)方法
- 定義接口規(guī)范 → 抽象方法
命名約定:
- 普通方法:小寫(xiě)加下劃線
calculate_total - 私有方法:雙下劃線開(kāi)頭
__internal_logic - 魔術(shù)方法:雙下劃線開(kāi)頭和結(jié)尾
__str__
封裝原則:
- 將不需要外部訪問(wèn)的方法設(shè)為私有
- 使用property控制屬性訪問(wèn)
- 通過(guò)方法暴露必要功能而非直接訪問(wèn)屬性
文檔說(shuō)明:
- 使用docstring說(shuō)明方法用途和參數(shù)
- 明確哪些方法是公開(kāi)API,哪些是內(nèi)部實(shí)現(xiàn)
通過(guò)本文的學(xué)習(xí)和案例實(shí)踐,你應(yīng)該已經(jīng)掌握了Python中各種方法類(lèi)型的特點(diǎn)和使用場(chǎng)景。記住,選擇合適的方法類(lèi)型可以使你的代碼更加清晰、可維護(hù)和符合Python風(fēng)格。
以上就是Python類(lèi)中方法種類(lèi)與修飾符詳解的詳細(xì)內(nèi)容,更多關(guān)于Python方法種類(lèi)與修飾符的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺談keras 的抽象后端(from keras import backend as K)
這篇文章主要介紹了淺談keras 的抽象后端(from keras import backend as K),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
python字符串切割:str.split()與re.split()的對(duì)比分析
今天小編就為大家分享一篇python字符串切割:str.split()與re.split()的對(duì)比分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
python項(xiàng)目下生成requirements.txt方法
這篇文章主要介紹了python項(xiàng)目下生成requirements.txt的方法,很多小伙伴不知道如何生成requirements.txt,本文就通過(guò)代碼示例給大家詳細(xì)介紹如何生成,,需要的朋友可以參考下2023-06-06
Mac M1芯片適配Miniconda的最新解決方案小結(jié)
本文介紹如何在M1/M2 Mac上使用Miniconda搭建原生AI開(kāi)發(fā)環(huán)境,涵蓋Conda安裝、arm64環(huán)境配置、TensorFlow與PyTorch的GPU加速設(shè)置,以及環(huán)境隔離和復(fù)現(xiàn)方法,幫助開(kāi)發(fā)者高效運(yùn)行機(jī)器學(xué)習(xí)項(xiàng)目,感興趣的可以了解一下2026-04-04
python基于concurrent模塊實(shí)現(xiàn)多線程
這篇文章主要介紹了python基于concurrent模塊實(shí)現(xiàn)多線程,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-04-04
Django中的函數(shù)視圖和類(lèi)視圖以及路由的定義方式
Django視圖分函數(shù)視圖和類(lèi)視圖,前者用函數(shù)處理請(qǐng)求,后者繼承View類(lèi)定義方法,路由使用path()、re_path()或url(),通過(guò)include()整合子應(yīng)用路由,需注意請(qǐng)求方式判斷及裝飾器限制2025-08-08
Python ATM功能實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了Python ATM功能實(shí)現(xiàn)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03

