魔術方法__call__

__call__?是一個特殊方法(也稱為魔術方法),用于使一個類的實例能夠像函數一樣被調用。當定義了這個方法后,實例對象可以后接括號(即?())來觸發調用,這會讓實例表現得像函數一樣。

  1. ?使實例可調用?:允許類的實例像函數一樣被調用。
  2. ?保持狀態?:可以在多次調用之間保持實例的狀態(因為實例可以存儲屬性)。
  3. ?實現裝飾器?:常用于實現裝飾器類(Decorator Class)。
  4. ?模擬函數行為?:讓對象具備函數的行為,同時保留類的特性(如屬性、方法)。

?基本語法?

class MyClass:def __call__(self, *args, **kwargs):# 定義調用時的行為return "Called with:", args, kwargsobj = MyClass()
result = obj(1, 2, 3, name="Alice")  # 觸發 __call__
# result = obj()  # 觸發 __call__
print(result)# ('Called with:', (1, 2, 3), {'name': 'Alice'})
# ('Called with:', (), {})

?輸出:??

('Called with:', (1, 2, 3), {'name': 'Alice'})

?關鍵特點?

  1. ?***args?和?**kwargs**?
    __call__?可以接受任意數量的位置參數和關鍵字參數,類似于普通函數。

  2. ?實例本身仍然是一個對象?
    即使定義了?__call__,實例仍然可以擁有屬性和方法:

    class Adder:def __init__(self, initial=0):self.total = initialdef __call__(self, x):self.total += xreturn self.totaladd = Adder(10)
    print(add(5))  # 15(10 + 5)
    print(add(3))  # 18(15 + 3)
  3. ?用于裝飾器?
    __call__?可以讓類的實例作為裝飾器使用:

    class Logger:def __init__(self, func):self.func = funcdef __call__(self, *args, ?**kwargs):print(f"Calling {self.func.__name__}")return self.func(*args, ?**kwargs)@Logger
    def greet(name):return f"Hello, {name}!"print(greet("Alice"))

    ?輸出:??

    Calling greet
    Hello, Alice!

?**__call__?vs?__init__**?

方法調用時機用途
__init__實例化時調用(obj = MyClass()初始化對象屬性
__call__實例被調用時(obj()讓實例像函數一樣執行

?實際應用場景?

  1. ?狀態保持的函數?(類似閉包)

    class Counter:def __init__(self):self.count = 0def __call__(self):self.count += 1return self.countcounter = Counter()
    print(counter())  # 1
    print(counter())  # 2
  2. ?實現策略模式?

    class Multiply:def __call__(self, a, b):return a * bclass Add:def __call__(self, a, b):return a + bdef calculate(operation, a, b):return operation(a, b)print(calculate(Multiply(), 3, 4))  # 12
    print(calculate(Add(), 3, 4))      # 7
  3. ?動態生成對象行為?

    class Power:def __init__(self, exponent):self.exponent = exponentdef __call__(self, x):return x ?**? self.exponentsquare = Power(2)
    cube = Power(3)
    print(square(4))  # 16
    print(cube(3))    # 27

?總結?

  • __call__?讓類的實例可以像函數一樣被調用。
  • 適用于需要保持狀態的函數、裝飾器類、策略模式等場景。
  • 不同于?__init__,它控制的是實例的調用行為,而非初始化行為。

如果你想讓一個對象既能存儲數據又能像函數一樣執行操作,__call__?是一個非常有用的工具!

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

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

相關文章

PHP中的異常處理與錯誤日志記錄

在PHP編程實踐中,異常處理是一項至關重要的技能,它能夠幫助開發者識別和響應程序執行過程中發生的非預期事件。與此同時,錯誤日志記錄是確保應用程序可靠性和穩定性的關鍵組成部分。本文將詳細介紹如何在PHP中實現這兩個方面的技術。 首先&a…

JS去除空格(數組內字符串)

1.JS中去除空格 去除這個數組中每個對象內部參數(也就是屬性值)的空格,可以通過遍歷數組,再遍歷每個對象的屬性,使用 trim() 方法來去除字符串首尾的空格。以下是具體實現代碼: let data [{ designHours:…

【Spring篇01】:Bean的線程安全問題總結

文章目錄 1. 核心問題:Spring 框架中的 Bean 是線程安全的嗎?2. 最佳實踐與解決方案禁止方案:濫用prototype作用域推薦方案(按優先級排序) 3. 生產環境中的典型案例Case 1:訂單服務統計Case 2:用…

本地項目上傳git

將您本地的項目代碼上傳到一個私有的、別人看不見的 GitHub 倉庫,是進行云端協作(如使用 Google Colab)、版本控制和代碼備份的最佳實踐。這是一個非常重要的技能。 整個過程可以分為三個部分: 準備工作:在您的電腦上…

【.NET Framework 窗體應用程序項目結構介紹】

在使用 Visual Studio (VS) 開發 .NET Framework 窗體應用程序(Windows Forms App) 時,項目結構通常包含以下核心文件夾和文件。以下是詳細介紹: 1. 項目根目錄下的主要文件 (1) .csproj 文件 作用:C# 項目文件&…

【SpringAI】4.多模態提問

SpringAI多模態提問 概述 SpringAI支持多模態輸入,允許AI模型同時處理文本和圖像內容。這對于需要視覺理解的AI應用場景非常有用,如圖像描述、視覺問答、圖像分析等。 核心概念 1. Media類 SpringAI使用Media類來表示多模態內容,支持圖…

自動化提示工程:未來AI優化的關鍵突破

自動化提示工程:未來AI優化的關鍵突破 自動化提示工程能夠自動化或半自動化地生成或優化提示詞,以探索大規模的提示詞組合,并通過 自動優化技術提升提示詞生成的穩定性? 依據自動化提示工程實現形式在邏輯推理和效能導向 兩個維度的取舍上,將其分為基于思維鏈的自動化提示工…

多模態大語言模型arxiv論文略讀(148)

A Comprehensive Survey and Guide to Multimodal Large Language Models in Vision-Language Tasks ?? 論文標題:A Comprehensive Survey and Guide to Multimodal Large Language Models in Vision-Language Tasks ?? 論文作者:Chia Xin Liang, P…

關于.net core開發的實體所有注解詳解

以下是對 .NET Core 開發中實體類(用于數據模型)和 Web API 控制器/方法(用于定義接口)常用注解屬性(Attributes)的詳細說明與示例,涵蓋數據驗證、API 行為控制、序列化、Swagger/OpenAPI 文檔生…

【安全工具】SQLMap 使用詳解:從基礎到高級技巧

目錄 簡介 一、安裝與基礎配置 1. 安裝方法 2. 基本語法 二、基礎掃描技術 1. 簡單檢測 2. 指定參數掃描 3. 批量掃描 三、信息收集 1. 獲取數據庫信息 2. 獲取當前數據庫 3. 獲取數據庫用戶 4. 獲取數據庫版本 四、數據提取技術 1. 列出所有表 2. 提取表數據 …

Redis大Key拆分實戰指南:從問題定位到落地優化

引言 最近在項目里遇到一個棘手問題:生產環境的Redis突然變“卡”了!查詢延遲從幾毫秒飆升到幾百毫秒,監控面板顯示某個節點CPU使用率飆到90%。排查半天才發現,原來是某個用戶訂單的Hash Key太大了——單Key存了100多萬個訂單字段…

RabbitMQ簡單消息發送

RabbitMQ簡單消息發送 簡單代碼實現RabbitMQ消息發送 需要的依賴 <!--rabbitmq--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId><version>x.x.x</version>&l…

【閱讀筆記】基于雙邊濾波改進的空域濾波算法

一、雙邊濾波空域濾波算法 雙邊濾波是一種典型的非線性濾波算法。基于高斯濾波&#xff0c;雙邊濾波利用強度的變化來保存邊緣信息&#xff0c;解決了邊緣模糊在視覺觀感上認為重要信息丟失的問題。雙邊濾波的濾波效果主要取決于兩個參數&#xff1a;兩個像素的空間鄰近性和灰…

華為交換機堆疊與集群技術深度解析附帶腳本

一、引言 在企業園區網、數據中心等網絡場景中&#xff0c;為了提升網絡的可靠性、擴展性和管理效率&#xff0c;華為交換機提供了堆疊&#xff08;Stack&#xff09;和集群&#xff08;CSS&#xff0c;Cluster Switch System &#xff09;技術。這兩種技術能夠將多臺物理交換…

Python網絡爬蟲(十三)- 數據解析模塊 BeautifulSoup

1、BS4簡介 BeautifulSoup(簡稱 BS4) 是一個用于解析 HTML 和 XML 文檔的 Python 第三方庫。它能夠從網頁或其他 HTML/XML 格式的文本中提取數據,并將其轉換為結構化的對象,方便開發者快速定位、提取和操作所需信息。它的核心功能是通過解析器將無序的標記語言轉換為樹形結…

如何使用 Pytorch Lightning 啟用早停機制

【PL 基礎】如何啟用早停機制 摘要1. on_train_batch_start()2. EarlyStopping Callback 摘要 本文介紹了兩種在 PyTorch Lightning 中實現早停機制的方法。第一種是通過重寫on_train_batch_start()方法手動控制訓練流程&#xff1b;第二種是使用內置的EarlyStopping回調&#…

深入理解前綴和與差分算法及其C++實現

前綴和與差分是算法競賽和編程中非常重要的兩種技巧&#xff0c;它們能夠高效地處理區間查詢和區間更新問題。本文將詳細介紹這兩種算法的原理、應用場景以及C實現。 一、前綴和算法 1.1 前綴和的基本概念 前綴和&#xff08;Prefix Sum&#xff09;是一種預處理技術&#x…

HugeGraph【部署】Linux單機部署

注: hugegraph從版本 1.5.0 開始&#xff0c;需要 Java11 運行時環境 一、安裝JDK11 1.下載JDK11 https://www.oracle.com/java/technologies/downloads/#java11 2.解壓縮包 tar -zxvf jdk-11.0.27_linux-x64_bin.tar.gz 3.修改/etc/profile環境變量 export JAVA_HOME/usr…

C++異步編程里避免超時機制

C標準庫中時鐘&#xff08;Clock&#xff09; 這段內容主要介紹了C標準庫中**時鐘&#xff08;Clock&#xff09;**的概念和分類&#xff0c;以及它們在時間測量中的作用。以下是關鍵信息的解讀&#xff1a; 一、時鐘的核心特性 C中的時鐘是一個類&#xff0c;提供以下四個基…

npm install安裝不成功(node:32388)怎么解決?

如果在執行 npm install 時出現問題&#xff0c;尤其是 node:32388 相關的錯誤&#xff0c;這通常意味著某些依賴或配置出了問題。這里有一些常見的解決方法&#xff0c;你可以嘗試&#xff1a; 1. 清除 npm 緩存 有時候&#xff0c;npm 緩存問題會導致安裝失敗。你可以清除 …