Python 基礎語法與數據類型(十三) - 實例方法、類方法、靜態方法


創作不易,請各位看官順手點點關注,不勝感激 。

本篇將深入探討 Python 類中不同類型的方法:實例方法 (Instance Methods)類方法 (Class Methods)靜態方法 (Static Methods)。理解這三者之間的區別和適用場景是掌握 Python 面向對象編程的關鍵。

1. 實例方法 (Instance Methods)

實例方法是我們最常用、最熟悉的方法類型。它們操作的是對象(實例) 的數據。當你調用一個實例方法時,Python 會自動把該方法所屬的實例(對象本身)作為第一個參數傳遞給它。

1.1 特點與語法
  • 特點:
    • 第一個參數必須是 self(約定俗成),它指向當前實例。
    • 可以訪問和修改實例的屬性 (self.attribute)。
    • 可以訪問和修改類的屬性 (ClassName.attributeself.attribute)。
    • 是最常見的方法類型,用于定義對象的行為。
  • 語法:
    class MyClass:def instance_method(self, arg1, arg2):# 可以訪問 self.some_instance_attribute# 可以訪問 MyClass.some_class_attributepass
    
1.2 實例方法示例

讓我們用一個 Robot 類來演示實例方法:

class Robot:"""一個簡單的機器人模擬類"""population = 0 # 類屬性:機器人總數量def __init__(self, name, model):"""初始化機器人實例"""self.name = name    # 實例屬性:機器人名稱self.model = model  # 實例屬性:機器人型號self.energy = 100   # 實例屬性:初始能量Robot.population += 1 # 每創建一個實例,類屬性 population 增加def greet(self): # 實例方法"""機器人問候,使用實例屬性 name"""if self.energy > 10:print(f"你好!我是機器人 {self.name},型號 {self.model}。")self.energy -= 5 # 問候消耗能量else:print(f"{self.name} 能量不足,無法問候。")def charge(self, amount): # 實例方法"""為機器人充電"""self.energy = min(100, self.energy + amount) # 能量不超過100print(f"{self.name} 已充電 {amount} 單位,當前能量: {self.energy}")def get_info(self): # 實例方法"""獲取機器人信息"""print(f"[{self.name}] 型號: {self.model}, 能量: {self.energy}, 機器人總數: {Robot.population}")# 創建機器人實例
robot1 = Robot("Wall-E", "Cleaner-Bot")
robot2 = Robot("Eve", "Explorer-Bot")# 調用實例方法
robot1.greet()
robot2.greet()
robot1.charge(20)
robot1.greet()robot1.get_info()
robot2.get_info()

輸出:

你好!我是機器人 Wall-E,型號 Cleaner-Bot。
你好!我是機器人 Eve,型號 Explorer-Bot。
Wall-E 已充電 20 單位,當前能量: 115
你好!我是機器人 Wall-E,型號 Cleaner-Bot。
[Wall-E] 型號: Cleaner-Bot, 能量: 110, 機器人總數: 2
[Eve] 型號: Explorer-Bot, 能量: 95, 機器人總數: 2

在這個例子中,greet, charge, get_info 都是實例方法,它們都接收 self 參數,并利用 self.nameself.energy 等實例屬性來執行特定操作。


2. 類方法 (Class Methods)

類方法是綁定到而不是實例的方法。它們主要用于操作類屬性,或者創建新的類實例(作為工廠方法)。

2.1 特點與語法
  • 特點:
    • @classmethod 裝飾器標識。
    • 第一個參數必須是 cls(約定俗成),它指向類本身(而不是實例)。
    • 可以訪問和修改類屬性 (cls.attribute)。
    • 不能直接訪問實例屬性,因為它們與特定實例無關(但可以通過 cls 創建新實例)。
    • 常用于定義替代的構造方法(工廠方法)。
  • 語法:
    class MyClass:class_attribute = "..."@classmethoddef class_method(cls, arg1, arg2):# 可以訪問 cls.class_attribute# 可以通過 cls() 創建新實例pass
    
2.2 類方法示例

繼續使用 Robot 類,我們添加一個類方法來記錄機器人總數,或者從不同格式的數據創建機器人:

class Robot:"""一個簡單的機器人模擬類"""population = 0 # 類屬性:機器人總數量known_models = ["Cleaner-Bot", "Explorer-Bot", "Worker-Bot"]def __init__(self, name, model):self.name = nameself.model = modelself.energy = 100Robot.population += 1# ... (實例方法與上面相同) ...def greet(self):if self.energy > 10:print(f"你好!我是機器人 {self.name},型號 {self.model}。")self.energy -= 5else:print(f"{self.name} 能量不足,無法問候。")def charge(self, amount):self.energy = min(100, self.energy + amount)print(f"{self.name} 已充電 {amount} 單位,當前能量: {self.energy}")def get_info(self):print(f"[{self.name}] 型號: {self.model}, 能量: {self.energy}, 機器人總數: {Robot.population}")@classmethod # 聲明這是一個類方法def get_robot_population(cls): # cls 指向類本身 (Robot)"""返回當前所有機器人實例的總數量。"""print(f"當前機器人總數是: {cls.population}") # 訪問類屬性return cls.population@classmethod # 聲明這是一個類方法,作為工廠方法def create_from_string(cls, robot_string):"""從 'name-model' 格式的字符串創建機器人實例。Args:robot_string (str): 格式為 'name-model' 的字符串。Returns:Robot: 新創建的 Robot 實例,如果模型未知則返回 None。"""parts = robot_string.split('-')if len(parts) == 2:name, model = parts[0], parts[1]if model in cls.known_models: # 檢查模型是否已知,使用了類屬性return cls(name, model) # 使用 cls() 來創建新的實例else:print(f"警告: 未知機器人型號 '{model}'。無法創建。")return Noneelse:print("錯誤: 字符串格式不正確,應為 'name-model'。")return None# 調用類方法
Robot.get_robot_population() # 通過類名調用robot3 = Robot.create_from_string("Optimus-Worker-Bot") # 通過類名調用工廠方法
if robot3:robot3.greet()Robot.create_from_string("Unknown-Model") # 嘗試創建未知模型
Robot.create_from_string("JustOnePart")   # 嘗試創建格式錯誤Robot.get_robot_population() # 再次查看機器人總數

輸出:

當前機器人總數是: 2
正在初始化機器人 Optimus,型號 Worker-Bot...
你好!我是機器人 Optimus,型號 Worker-Bot。
警告: 未知機器人型號 'Unknown-Model'。無法創建。
錯誤: 字符串格式不正確,應為 'name-model'。
當前機器人總數是: 3

get_robot_population 中,我們使用 cls.population 來訪問類屬性。在 create_from_string 方法中,cls(name, model) 相當于 Robot(name, model),這意味著我們可以通過 cls 這個引用來創建類的實例。這在子類化時非常有用,因為 cls 將動態地指向實際調用的那個類(子類或父類)。


3. 靜態方法 (Static Methods)

靜態方法是與類相關但不需要訪問類或實例數據的函數。它們本質上就是放在類命名空間下的普通函數,與類或實例狀態無關。

3.1 特點與語法
  • 特點:
    • @staticmethod 裝飾器標識。
    • 不接收 selfcls 作為第一個參數。
    • 不能訪問實例屬性或類屬性(除非你明確地傳遞它們作為參數)。
    • 通常用于與類邏輯相關,但又不依賴于特定實例或類狀態的輔助功能。
  • 語法:
    class MyClass:@staticmethoddef static_method(arg1, arg2):# 不涉及 self 或 clspass
    
3.2 靜態方法示例

繼續 Robot 類,我們添加一個靜態方法來驗證機器人名稱的有效性:

import re # 導入正則表達式模塊class Robot:"""一個簡單的機器人模擬類"""population = 0known_models = ["Cleaner-Bot", "Explorer-Bot", "Worker-Bot"]def __init__(self, name, model):self.name = nameself.model = modelself.energy = 100Robot.population += 1# ... (實例方法和類方法與上面相同) ...def greet(self):if self.energy > 10:print(f"你好!我是機器人 {self.name},型號 {self.model}。")self.energy -= 5else:print(f"{self.name} 能量不足,無法問候。")def charge(self, amount):self.energy = min(100, self.energy + amount)print(f"{self.name} 已充電 {amount} 單位,當前能量: {self.energy}")def get_info(self):print(f"[{self.name}] 型號: {self.model}, 能量: {self.energy}, 機器人總數: {Robot.population}")@classmethoddef get_robot_population(cls):print(f"當前機器人總數是: {cls.population}")return cls.population@classmethoddef create_from_string(cls, robot_string):parts = robot_string.split('-')if len(parts) == 2:name, model = parts[0], parts[1]if model in cls.known_models and cls.is_valid_name(name): # 在這里使用靜態方法return cls(name, model)else:print(f"警告: 型號 '{model}' 未知或名稱 '{name}' 無效。無法創建。")return Noneelse:print("錯誤: 字符串格式不正確,應為 'name-model'。")return None@staticmethod # 聲明這是一個靜態方法def is_valid_name(name): # 不接收 self 或 cls 參數"""檢查機器人名稱是否有效(只包含字母、數字和連字符,長度在 3-20 之間)。Args:name (str): 要檢查的名稱。Returns:bool: 如果名稱有效則返回 True,否則返回 False。"""if 3 <= len(name) <= 20 and re.fullmatch(r'^[a-zA-Z0-9-]+$', name):return Trueprint(f"名稱 '{name}' 無效。")return False# 調用靜態方法 (可以通過類名或實例名調用,但通常通過類名調用)
print(f"\n檢查名稱 'R2-D2' 是否有效: {Robot.is_valid_name('R2-D2')}")
print(f"檢查名稱 'C3PO!' 是否有效: {Robot.is_valid_name('C3PO!')}")# 結合使用
valid_robot = Robot.create_from_string("MegaBot-Worker-Bot")
if valid_robot:valid_robot.greet()invalid_name_robot = Robot.create_from_string("Bad!Name-Cleaner-Bot")

輸出:

檢查名稱 'R2-D2' 是否有效: True
名稱 'C3PO!' 無效。
檢查名稱 'C3PO!' 是否有效: False
正在初始化機器人 MegaBot,型號 Worker-Bot...
你好!我是機器人 MegaBot,型號 Worker-Bot。
名稱 'Bad!Name' 無效。
警告: 型號 'Cleaner-Bot' 未知或名稱 'Bad!Name' 無效。無法創建。

is_valid_name 方法不依賴于任何特定的 Robot 實例的數據,也不依賴于 Robot 類的數據(除了它被邏輯上歸類到 Robot 下)。它只是一個獨立的輔助函數,所以把它定義為靜態方法是合適的。


4. 三種方法的對比總結

特性實例方法 (Instance Method)類方法 (Class Method)靜態方法 (Static Method)
裝飾器無 (默認)@classmethod@staticmethod
第一個參數self (指向實例)cls (指向類)
訪問實例屬性 (self.attr)不能 (除非創建新實例)不能
訪問類屬性 (ClassName.attrself.attr) (cls.attr)不能 (除非明確傳遞)
用途定義對象特有的行為,操作實例數據操作類數據,作為替代構造器 (工廠方法)輔助函數,不依賴實例或類狀態
調用方式instance.method()ClassName.method()instance.method()ClassName.method()instance.method()

選擇哪種方法?

  • 如果你需要訪問或修改實例的屬性,使用實例方法
  • 如果你需要訪問或修改類的屬性,或者需要一個替代的構造器(工廠方法),使用類方法
  • 如果你只是想把一個函數邏輯上歸類到某個類下,但它既不需要訪問實例屬性,也不需要訪問類屬性,那么使用靜態方法

總結

實例方法、類方法和靜態方法是 Python 面向對象編程中三種不同類型的函數。它們各自有獨特的用途和調用約定。正確地選擇和使用它們可以幫助你更好地組織代碼,使類設計更加清晰、合理,并提高代碼的可維護性和可讀性。理解它們之間的差異,特別是 selfcls 參數的含義,是掌握 Python OOP 的重要一步。

練習題

嘗試獨立完成以下練習題,并通過答案進行對照:

  1. Calculator 類:

    • 定義一個 Calculator 類。
    • 定義一個實例方法 add(self, a, b),返回 a + b
    • 定義一個實例方法 subtract(self, a, b),返回 a - b
    • 定義一個靜態方法 multiply(a, b),返回 a * b
    • 定義一個靜態方法 divide(a, b),返回 a / b(注意除數為 0 的情況,可以簡單處理為打印錯誤信息并返回 None)。
    • 創建一個 Calculator 對象,并分別調用所有方法進行計算。
  2. Product 類(結合多種方法):

    • 定義一個 Product 類。
    • 添加一個類屬性 next_id = 1,用于生成唯一的商品 ID。
    • __init__ 中,接收 nameprice。將 next_id 賦值給 self.product_id,然后讓 next_id 遞增。
    • 定義一個實例方法 get_display_price(self),返回格式化后的價格字符串,例如 "$19.99"
    • 定義一個類方法 from_csv_string(cls, csv_string),它接收一個形如 "Laptop,1200.50" 的 CSV 字符串,然后解析它并返回一個新的 Product 實例。
    • 定義一個靜態方法 is_valid_price(price),檢查價格是否大于 0。
    • 創建幾個 Product 實例,包括使用 from_csv_string 創建的。測試所有方法。
  3. Logger 類:

    • 定義一個 Logger 類。
    • 添加一個類屬性 log_file_path = "app.log"
    • 定義一個類方法 set_log_file(cls, path),用于更改日志文件路徑。
    • 定義一個靜態方法 _format_message(message),用于給日志消息添加時間戳和級別(例如,"[2025-07-17 17:50:00] [INFO]: message"),這里時間部分可以簡化為 time.time()datetime.datetime.now().strftime(...)
    • 定義一個實例方法 log_info(self, message),它接收一條消息,使用 _format_message 格式化后,追加到 log_file_path 指定的文件中。
    • 創建一個 Logger 實例。
    • 記錄幾條信息。
    • 更改日志文件路徑,并再次記錄信息,驗證是否寫入到新文件。
    • 讀取日志文件內容并打印。

練習題答案

1. Calculator 類:

# 1. Calculator 類
class Calculator:def add(self, a, b): # 實例方法"""返回兩個數的和。"""print(f"實例方法 add: {a} + {b} = {a + b}")return a + bdef subtract(self, a, b): # 實例方法"""返回兩個數的差。"""print(f"實例方法 subtract: {a} - {b} = {a - b}")return a - b@staticmethoddef multiply(a, b): # 靜態方法"""返回兩個數的乘積。"""print(f"靜態方法 multiply: {a} * {b} = {a * b}")return a * b@staticmethoddef divide(a, b): # 靜態方法"""返回兩個數的商,處理除數為0的情況。"""if b == 0:print("錯誤: 除數不能為零。")return Noneprint(f"靜態方法 divide: {a} / {b} = {a / b}")return a / b# 創建 Calculator 對象
calc = Calculator()# 調用實例方法
calc.add(10, 5)
calc.subtract(20, 7)# 調用靜態方法 (可以通過類名或實例名調用,推薦類名)
Calculator.multiply(4, 6)
calc.divide(10, 2)
Calculator.divide(10, 0)

輸出:

實例方法 add: 10 + 5 = 15
實例方法 subtract: 20 - 7 = 13
靜態方法 multiply: 4 * 6 = 24
靜態方法 divide: 10 / 2 = 5.0
錯誤: 除數不能為零。

2. Product 類(結合多種方法):

# 2. Product 類 (結合多種方法)
class Product:next_id = 1 # 類屬性:用于生成唯一的商品 IDdef __init__(self, name, price):"""初始化 Product 對象。Args:name (str): 產品名稱。price (float): 產品價格。"""if not self.is_valid_price(price): # 可以在 __init__ 中調用靜態方法進行驗證raise ValueError("價格必須大于0。")self.product_id = Product.next_idProduct.next_id += 1 # 遞增類屬性self.name = nameself.price = priceprint(f"產品 '{self.name}' (ID: {self.product_id}) 創建成功。")def get_display_price(self): # 實例方法"""返回格式化后的價格字符串。"""return f"${self.price:.2f}"@classmethoddef from_csv_string(cls, csv_string): # 類方法:工廠方法"""從 'name,price' 格式的 CSV 字符串創建 Product 實例。Args:csv_string (str): 格式為 'name,price' 的 CSV 字符串。Returns:Product: 新創建的 Product 實例,如果格式錯誤或價格無效則返回 None。"""parts = csv_string.split(',')if len(parts) == 2:name = parts[0].strip()try:price = float(parts[1].strip())if cls.is_valid_price(price): # 在類方法中調用靜態方法進行驗證return cls(name, price) # 使用 cls() 來創建新的實例else:print(f"從 CSV 創建失敗: 價格 '{price}' 無效。")return Noneexcept ValueError:print(f"從 CSV 創建失敗: 價格 '{parts[1]}' 不是有效數字。")return Noneelse:print("從 CSV 創建失敗: 字符串格式不正確,應為 'name,price'。")return None@staticmethoddef is_valid_price(price): # 靜態方法"""檢查價格是否有效 (大于 0)。Args:price (float/int): 要檢查的價格。Returns:bool: 如果價格有效則返回 True,否則返回 False。"""return price > 0# 創建 Product 實例
p1 = Product("Laptop", 1200.50)
p2 = Product("Mouse", 25)print(f"產品 {p1.name} 的顯示價格: {p1.get_display_price()}")
print(f"產品 {p2.name} 的顯示價格: {p2.get_display_price()}")# 使用類方法創建實例
p3 = Product.from_csv_string("Keyboard,75.99")
if p3:print(f"產品 {p3.name} (ID: {p3.product_id}) 的顯示價格: {p3.get_display_price()}")p4 = Product.from_csv_string("Headphones,0") # 無效價格
p5 = Product.from_csv_string("Monitor,abc") # 無效格式
p6 = Product.from_csv_string("Webcam")      # 格式錯誤# 再次查看類屬性 next_id
print(f"下一個產品 ID 將是: {Product.next_id}")

輸出:

產品 'Laptop' (ID: 1) 創建成功。
產品 'Mouse' (ID: 2) 創建成功。
產品 Laptop 的顯示價格: $1200.50
產品 Mouse 的顯示價格: $25.00
產品 'Keyboard' (ID: 3) 創建成功。
產品 Keyboard (ID: 3) 的顯示價格: $75.99
從 CSV 創建失敗: 價格 '0.0' 無效。
從 CSV 創建失敗: 價格 'abc' 不是有效數字。
從 CSV 創建失敗: 字符串格式不正確,應為 'name,price'。
下一個產品 ID 將是: 4

3. Logger 類:

# 3. Logger 類
import datetime
import os # 用于檢查文件是否存在class Logger:log_file_path = "app.log" # 類屬性:默認日志文件路徑@classmethoddef set_log_file(cls, path): # 類方法"""設置日志文件路徑。"""cls.log_file_path = pathprint(f"日志文件路徑已更改為: {cls.log_file_path}")@staticmethoddef _format_message(message, level="INFO"): # 靜態方法"""格式化日志消息,添加時間戳和級別。Args:message (str): 原始日志消息。level (str, optional): 日志級別。默認為 "INFO"。Returns:str: 格式化后的日志消息。"""timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")return f"[{timestamp}] [{level.upper()}]: {message}"def log_info(self, message): # 實例方法"""將 INFO 級別的消息寫入日志文件。"""formatted_message = self._format_message(message, level="INFO") # 調用靜態方法try:# 使用類屬性 log_file_pathwith open(Logger.log_file_path, 'a', encoding='utf-8') as f:f.write(formatted_message + "\n")print(f"日志記錄成功: '{message}' -> '{Logger.log_file_path}'")except IOError as e:print(f"日志寫入失敗到 '{Logger.log_file_path}': {e}")def log_error(self, message): # 另一個實例方法,演示不同級別"""將 ERROR 級別的消息寫入日志文件。"""formatted_message = self._format_message(message, level="ERROR")try:with open(Logger.log_file_path, 'a', encoding='utf-8') as f:f.write(formatted_message + "\n")print(f"錯誤日志記錄成功: '{message}' -> '{Logger.log_file_path}'")except IOError as e:print(f"錯誤日志寫入失敗到 '{Logger.log_file_path}': {e}")# 清理舊的日志文件(如果存在)
if os.path.exists("app.log"):os.remove("app.log")
if os.path.exists("debug.log"):os.remove("debug.log")# 創建 Logger 實例
my_logger = Logger()# 記錄幾條信息
my_logger.log_info("應用程序啟動。")
my_logger.log_info("用戶 'admin' 登錄成功。")
my_logger.log_error("數據庫連接失敗。")# 更改日志文件路徑 (通過類方法)
Logger.set_log_file("debug.log")# 再次記錄信息,驗證是否寫入到新文件
my_logger.log_info("正在進行調試操作...")
my_logger.log_error("發現一個嚴重 bug。")# 讀取并打印 app.log 的內容
print("\n--- app.log 內容 ---")
try:with open("app.log", 'r', encoding='utf-8') as f:print(f.read())
except FileNotFoundError:print("app.log 文件不存在。")# 讀取并打印 debug.log 的內容
print("\n--- debug.log 內容 ---")
try:with open("debug.log", 'r', encoding='utf-8') as f:print(f.read())
except FileNotFoundError:print("debug.log 文件不存在。")

輸出(日期和時間會根據你運行的實際時間有所不同):

日志記錄成功: '應用程序啟動。' -> 'app.log'
日志記錄成功: '用戶 'admin' 登錄成功。' -> 'app.log'
錯誤日志記錄成功: '數據庫連接失敗。' -> 'app.log'
日志文件路徑已更改為: debug.log
日志記錄成功: '正在進行調試操作...' -> 'debug.log'
錯誤日志記錄成功: '發現一個嚴重 bug。' -> 'debug.log'--- app.log 內容 ---
[2025-07-17 17:50:18] [INFO]: 應用程序啟動。
[2025-07-17 17:50:18] [INFO]: 用戶 'admin' 登錄成功。
[2025-07-17 17:50:18] [ERROR]: 數據庫連接失敗。--- debug.log 內容 ---
[2025-07-17 17:50:18] [INFO]: 正在進行調試操作...
[2025-07-17 17:50:18] [ERROR]: 發現一個嚴重 bug。

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

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

相關文章

Wireshark的安裝和基本使用

文章目錄一、Wireshark介紹二、Wireshark安裝三、Wireshark講解1.界面介紹&#xff08;1&#xff09;分組列表&#xff08;2&#xff09;分組詳情&#xff08;3&#xff09;分組字節流一、Wireshark介紹 Wireshark 是一款開源的網絡協議分析工具&#xff0c;能夠捕獲、過濾和分…

[yotroy.cool] Git 歷史遷移筆記:將 Git 項目嵌入另一個倉庫子目錄中(保留提交記錄)

個人博客https://www.yotroy.cool/&#xff0c;感謝關注&#xff5e; 圖片資源可能顯示不全&#xff0c;請前往博客查看哦&#xff01; 說來慚愧&#xff0c;這篇是AI幫助我解決實際問題后&#xff0c;又生成的一篇博客&#xff0c;效率特別高。 在開發中&#xff0c;我們常會…

91套商業策劃創業融資計劃書PPT模版

創業融資計劃書PPT模版&#xff0c;商業項目技術書PPT模版&#xff0c;商業創業計劃書&#xff0c;商業融資企業宣傳PPT模版&#xff0c;活動策劃方案書PPT模版&#xff0c;IOS風格商業計劃書PPT模版 91套商業策劃創業融資計劃書PPT模版&#xff1a;https://pan.quark.cn/s/739…

探秘阿里云通義九子:解鎖AI無限可能

通義九子初印象在當今人工智能飛速發展的時代&#xff0c;阿里云通義九子宛如一顆璀璨的明星&#xff0c;閃耀在 AI 的浩瀚天空中。作為阿里云推出的一系列強大的人工智能模型&#xff0c;通義九子在自然語言處理、圖像生成、智能客服等多個領域展現出了卓越的能力&#xff0c;…

Python網絡爬蟲之requests庫

目錄 一.網絡爬蟲的介紹 1.網絡爬蟲庫 2.robot.txt規則 二.requests庫 1.requests庫的安裝 2.get()函數 3.Response對象 Response的屬性 設置編碼 返回網頁內容 text() content() 三.提交信息到網頁 post()函數 四.會話與代理服務器 一.網絡爬蟲的介紹 1.網絡爬蟲…

區塊鏈技術詳解:從原理到應用

引言 區塊鏈作為一項顛覆性技術&#xff0c;已從加密貨幣的基石演變為重塑多個行業的創新引擎。本文旨在深入解析其核心原理、關鍵特性、技術架構、主流應用及未來挑戰。一、 區塊鏈核心概念&#xff1a;超越加密貨幣的分布式賬本 本質定義&#xff1a; 區塊鏈是一個去中心化、…

用Finalshell連接服務器后出現文件目錄不顯示,且刷新報錯空指針問題記錄

修改SSH配置?編輯sshd_config?使用管理員權限編輯/etc/ssh/sshd_config文件&#xff0c;找到Subsystem相關配置。原配置為Subsystem sftp /usr/libexec/openssh/sftp-server使用“i”編輯文件將修改為Subsystem sftp internal-sftp修改完成后使用Esc命令&#xff0c;退出編輯…

C語言:游戲代碼分享

小游戲分享 目錄 小游戲分享 1.井字棋游戲 2.簡單計算器游戲 3.猜單詞 4.石頭剪刀布游戲 5.猜數字游戲 1.井字棋游戲 「33 棋盤上的思維博弈&#xff01;與好友輪流落子&#xff0c;搶占先機&#xff0c;連成一線即可獲勝。簡單規則蘊含無限策略&#xff0c;展現你的戰術…

深度學習入門-卷積神經網絡(CNN)(下)

1-4、 深度學習入門-卷積神經網絡&#xff08;CNN&#xff09;&#xff08;上&#xff09;-CSDN博客 5、 卷積神經網絡&#xff08;CNN&#xff09;的實現 簡單網絡的構成是“Convolution - ReLU - Pooling - Affine - ReLU - Affine - Softmax”&#xff1a; 相關代碼&#…

Java 大視界 -- Java 大數據在智能交通智能公交站臺乘客流量預測與服務優化中的應用(349)

Java 大視界 -- Java 大數據在智能交通智能公交站臺乘客流量預測與服務優化中的應用&#xff08;349&#xff09;引言&#xff1a;正文&#xff1a;一、Java 全場景韌性調度系統&#xff08;新增極端天氣 車型適配&#xff09;1.1 極端天氣&#xff1a;暴雪 / 臺風的分鐘級響應…

數論內容主要包括哪些

數論&#xff08;Number Theory&#xff09;是數學中研究整數的性質及其相互關系的一個分支&#xff0c;被譽為“數學中的皇后”。它歷史悠久&#xff0c;內容豐富&#xff0c;既包含許多初等、直觀的問題&#xff0c;也涉及高深、抽象的理論。數論的主要內容包括以下幾個方面&…

springboot打包二次壓縮Excel導致損壞

springboot打包二次壓縮Excel導致損壞開發時&#xff0c;將Excel文件放到resources下&#xff0c;通過類加載器流讀取&#xff0c;返回api用于下載該Excel文件。我發現這樣下載的Excel被損壞了&#xff0c;無法打開&#xff0c;推測是springboot打包插件默認對resources下的所有…

huggingface筆記

1. huggingface的下載目錄 ~/.cache/huggingface 2. 如何修改hugging face的模型默認下載地址 huggingface的默認下載路徑在~/.cache/huggingface/hub/&#xff0c;但模型數據占用空間往往很大&#xff0c;可以用以下方法修改默認下載路徑。 方法一&#xff1a;在linux中指定環…

Redis3:Redis數據結構與命令全解析

目錄 1、redis數據結構介紹 1.1命令學習方式 1.1.1命令行查詢 2、redis的通用命令 2.1查找常見的通用命令 2.2常見的通用命令&#xff1a; 3、String類型 3.1String類型的常見命令 3.2Key的層級格式 3.2.1Key的結構 4、Hash類型 4.1Hash類型 4.2Hash類型常見命令 …

WebSocket 重連與心跳機制:打造堅如磐石的實時連接

在現代 Web 應用中&#xff0c;WebSocket 是實現實時通信的核心技術。但網絡環境復雜多變&#xff0c;如何確保連接穩定成為關鍵挑戰。本文將深入剖析 WebSocket 的重連與心跳機制&#xff0c;提供一套經過生產環境驗證的解決方案。 一、WebSocket 基礎封裝 首先我們實現一個具…

【代碼】Matlab鳥瞰圖函數

用matlab把圖像轉化為鳥瞰圖 代碼 clc clear close all I imread(road.png); figure(1) imshow(I) bevSensor load(birdsEyeConfig); birdsEyeImage transformImage(bevSensor.birdsEyeConfig,I); figure(2) imshow(birdsEyeImage)效果

網絡編程-java

Socket 套接字 Socket套接字&#xff0c;是由系統提供用于網絡通信的技術&#xff0c;是基于 TCP/IP 協議的網絡通信的基本單元。基于 Socket 套接字的網絡程序開發就是網絡編程。 應用層會調用操作系統提供的一組 api &#xff0c;這組 api 就是 socket api&#xff08;傳輸層…

CPU架構、三級緩存以及內存優化屏障

目錄 一、三級緩存和內存布局 二、CPU架構 &#xff08;1&#xff09;SMP對稱對處理器架構 &#xff08;2&#xff09;NUMA非統一內存架構 三、RCU機制在內核中的體現 四、內存優化屏障 &#xff08;1&#xff09;編譯器、CPU優化 &#xff08;2&#xff09;優化的問題…

HarmonyOS從入門到精通:動畫設計與實現之九 - 實用動畫案例詳解(下)

HarmonyOS動畫開發實戰&#xff08;九&#xff09;&#xff1a;實用動畫案例詳解&#xff08;下&#xff09; 在上篇中&#xff0c;我們圍繞加載動畫、點贊反饋、下拉刷新等核心交互場景&#xff0c;探討了如何通過動畫提升用戶體驗。本篇將聚焦界面元素動效與特殊場景動畫&…

Node.js 聊天內容加密解密實戰教程(含緩存密鑰優化)

一、技術方案說明 本方案采用以下技術組合&#xff1a; 加密算法&#xff1a;AES-256-GCM&#xff08;認證加密&#xff0c;防止篡改&#xff09;密鑰派生&#xff1a;PBKDF2&#xff08;10萬次迭代&#xff09;緩存機制&#xff1a;內存緩存 定期輪換安全特性&#xff1a;隨機…