最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中兩種策略模式的實(shí)現(xiàn)方法示例

 更新時(shí)間:2025年07月04日 08:46:16   作者:熱愛生活的猴子  
策略模式是一種行為型設(shè)計(jì)模式,它將一組可互換的算法封裝成獨(dú)立的類,使它們可以在運(yùn)行時(shí)靈活切換,這篇文章主要介紹了python中兩種策略模式的實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下

1.  基于接口/抽象類的實(shí)現(xiàn)(含繼承)

這是經(jīng)典策略模式的定義方式,必然包含繼承關(guān)系

from abc import ABC, abstractmethod

# 抽象策略類(必須繼承)
class TextSplitterStrategy(ABC):
    @abstractmethod
    def split(self, text: str) -> list[str]:
        pass

# 具體策略類(繼承抽象類)
class RecursiveSplitter(TextSplitterStrategy):
    def split(self, text: str) -> list[str]:
        # 實(shí)現(xiàn)遞歸分割邏輯
        return chunks

class TokenSplitter(TextSplitterStrategy):
    def split(self, text: str) -> list[str]:
        # 實(shí)現(xiàn)按token分割邏輯
        return chunks

# 上下文類(選擇策略)
class TextProcessor:
    def __init__(self, strategy: TextSplitterStrategy):
        self._strategy = strategy
    
    def process(self, text: str) -> list[str]:
        return self._strategy.split(text)

繼承關(guān)系

TextSplitterStrategy (抽象基類)
├── RecursiveSplitter
├── TokenSplitter
└── OtherSplitters

實(shí)際使用方法:

方式1:運(yùn)行時(shí)動(dòng)態(tài)指定策略(顯式選擇)

適用場(chǎng)景:需要在代碼中根據(jù)不同條件靈活切換策略

操作方法

  • 在創(chuàng)建 TextProcessor 時(shí),顯式傳入具體的策略實(shí)例

  • 策略實(shí)例可通過條件判斷、配置參數(shù)或用戶輸入決定

# 根據(jù)不同條件選擇策略
if use_case == "code":
    strategy = TokenSplitter()  # 選擇Token分割策略
elif use_case == "document":
    strategy = RecursiveSplitter()  # 選擇遞歸分割策略
else:
    strategy = DefaultSplitter()

# 創(chuàng)建處理器并傳入策略
processor = TextProcessor(strategy=strategy)

# 使用處理器
result = processor.process("your_text_here")

方式2:通過工廠類/函數(shù)封裝選擇邏輯(隱式選擇)

適用場(chǎng)景:希望隱藏策略選擇細(xì)節(jié),簡(jiǎn)化調(diào)用方代碼

操作方法

  • 定義一個(gè)策略工廠函數(shù)或類

  • 根據(jù)輸入?yún)?shù)(如字符串標(biāo)識(shí))返回對(duì)應(yīng)策略

def get_splitter(strategy_name: str) -> TextSplitterStrategy:
    """策略工廠函數(shù)"""
    strategies = {
        "recursive": RecursiveSplitter,
        "token": TokenSplitter,
        # 可擴(kuò)展其他策略...
    }
    if strategy_name not in strategies:
        raise ValueError(f"Unknown strategy: {strategy_name}")
    return strategies[strategy_name]()

# 使用工廠創(chuàng)建策略
strategy = get_splitter("token")  # 通過字符串標(biāo)識(shí)選擇
processor = TextProcessor(strategy=strategy)
result = processor.process("your_text_here")

2. 基于函數(shù)的實(shí)現(xiàn)(無(wú)繼承)

Python支持函數(shù)作為一等對(duì)象,策略模式可以完全不用繼承

# 策略定義為普通函數(shù)
def recursive_split(text: str) -> list[str]:
    return chunks

def token_split(text: str) -> list[str]:
    return chunks

# 上下文通過函數(shù)調(diào)用選擇策略
class TextProcessor:
    def __init__(self, split_strategy: callable):
        self._split = split_strategy
    
    def process(self, text: str) -> list[str]:
        return self._split(text)

無(wú)繼承關(guān)系,僅依賴函數(shù)簽名一致性(鴨子類型)。

基礎(chǔ)使用方式

1. 直接傳遞策略函數(shù)

# 定義策略函數(shù)
def recursive_split(text: str) -> list[str]:
    """遞歸分割策略"""
    return [text[i:i+100] for i in range(0, len(text), 100)]  # 示例:每100字符分割

def token_split(text: str) -> list[str]:
    """Token分割策略"""
    return text.split()  # 示例:按空格分詞

# 創(chuàng)建處理器時(shí)注入策略函數(shù)
processor = TextProcessor(split_strategy=recursive_split)  # 使用遞歸分割

# 處理文本
result = processor.process("這是一段需要分割的文本,長(zhǎng)度超過100個(gè)字符時(shí)應(yīng)自動(dòng)分割...")
print(result)

進(jìn)階使用方式

(1) 帶參數(shù)的策略函數(shù)

# 策略函數(shù)支持參數(shù)
def dynamic_split(text: str, chunk_size: int = 50) -> list[str]:
    return [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)]

# 使用functools.partial綁定參數(shù)
from functools import partial

# 創(chuàng)建固定參數(shù)的策略
custom_split = partial(dynamic_split, chunk_size=30)
processor = TextProcessor(split_strategy=custom_split)

(2) 策略工廠函數(shù)

def get_strategy(strategy_name: str, **params) -> callable:
    """策略工廠"""
    strategies = {
        "recursive": recursive_split,
        "token": token_split,
        "dynamic": dynamic_split
    }
    
    if strategy_name == "dynamic":
        return partial(dynamic_split, **params)
    return strategies[strategy_name]

# 通過工廠獲取策略
strategy = get_strategy("dynamic", chunk_size=40)
processor = TextProcessor(strategy)

總結(jié) 

到此這篇關(guān)于python中兩種策略模式的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)python策略模式實(shí)現(xiàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python數(shù)據(jù)可視化之從單變量到多變量的方法

    Python數(shù)據(jù)可視化之從單變量到多變量的方法

    Python憑借其強(qiáng)大的可視化庫(kù)(如Matplotlib、Seaborn)成為進(jìn)行EDA的首選工具,本文基于一份實(shí)用的Python數(shù)據(jù)可視化速查表,系統(tǒng)介紹從單變量到多變量、從時(shí)間序列到文本數(shù)據(jù)的可視化方法,需要的朋友可以參考下
    2026-01-01
  • Python對(duì)象轉(zhuǎn)換為json的方法步驟

    Python對(duì)象轉(zhuǎn)換為json的方法步驟

    這篇文章主要介紹了Python對(duì)象轉(zhuǎn)換為json的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • pytorch中Tensor.new()的使用解析

    pytorch中Tensor.new()的使用解析

    這篇文章主要介紹了pytorch中Tensor.new()的使用解析,Tensor.new()是創(chuàng)建一個(gè)新的Tensor,該Tensor的type和device都和原有Tensor一致,且無(wú)內(nèi)容,需要的朋友可以參考下
    2023-09-09
  • Python解決爬蟲程序卡死問題

    Python解決爬蟲程序卡死問題

    這篇文章主要介紹了Python解決爬蟲程序卡死問題,文章圍繞主題展開詳細(xì)內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • flask入門之表單的實(shí)現(xiàn)

    flask入門之表單的實(shí)現(xiàn)

    這篇文章主要介紹了flask入門之表單的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2018-07-07
  • 使用python爬取抖音視頻列表信息

    使用python爬取抖音視頻列表信息

    這篇文章主要介紹了如何用python爬取抖音視頻列表信息,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 解決使用export_graphviz可視化樹報(bào)錯(cuò)的問題

    解決使用export_graphviz可視化樹報(bào)錯(cuò)的問題

    今天小編就為大家分享一篇解決使用export_graphviz可視化樹報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2019-08-08
  • python如何實(shí)現(xiàn)wifi自動(dòng)連接,解決電腦wifi經(jīng)常斷開問題

    python如何實(shí)現(xiàn)wifi自動(dòng)連接,解決電腦wifi經(jīng)常斷開問題

    這篇文章主要介紹了python實(shí)現(xiàn)wifi自動(dòng)連接,解決電腦wifi經(jīng)常斷開的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Python中的Django基本命令實(shí)例詳解

    Python中的Django基本命令實(shí)例詳解

    這篇文章主要介紹了Python之Django基本命令 ,需要的朋友可以參考下
    2018-07-07
  • Python單向鏈表和雙向鏈表原理與用法實(shí)例詳解

    Python單向鏈表和雙向鏈表原理與用法實(shí)例詳解

    這篇文章主要介紹了Python單向鏈表和雙向鏈表原理與用法,結(jié)合實(shí)例形式詳細(xì)分析了單向鏈表與雙向鏈表的概念、原理以及創(chuàng)建、添加、刪除等相關(guān)操作技巧,需要的朋友可以參考下
    2018-08-08

最新評(píng)論

上林县| 阳城县| 长葛市| 扶绥县| 眉山市| 桦南县| 万荣县| 清水河县| 红安县| 乃东县| 临安市| 南通市| 聂拉木县| 梨树县| 扎赉特旗| 宁波市| 汾阳市| 哈尔滨市| 依安县| 辽源市| 漾濞| 隆德县| 林甸县| 布尔津县| 哈尔滨市| 大石桥市| 宁晋县| 西宁市| 泸水县| 噶尔县| 荆州市| 海淀区| 乐都县| 内乡县| 兴城市| 元谋县| 惠东县| 铜陵市| 大厂| 始兴县| 谷城县|