簡體   English   中英

什么時候使用__call__好主意?

[英]When is using __call__ a good idea?

人們對使用__call__的看法是什么。 我只是很少看到它使用,但我認為當你知道一個類將被用於某些默認行為時,它是一個非常方便的工具。

我認為你的直覺是正確的。

從歷史上看,OO世界中使用了可調用對象(或者我有時稱之為“仿函數”的對象)來模擬閉包。 在C ++中,它們經常是不可或缺的。

但是, __call__在Python世界中有相當多的競爭:

  • 一種常規命名方法,其行為有時可以更容易地從名稱中推斷出來。 可以轉換為綁定方法,可以像函數一樣調用。
  • 一個閉包,通過返回嵌套塊中定義的函數獲得。
  • 一種lambda,這是一種有限但快速的封閉方式。
  • 生成器和協同程序,其身體保持積累狀態就像仿函數一樣。

我會說使用__call__的時間是因為上面的一個選項沒有給你更好的服務。 或許,請檢查以下標准:

  • 你的對象有狀態。
  • 你的班級有明確的“主要”行為,這有點愚蠢。 例如,如果您發現自己編寫run()doStuff()go()或者流行且永遠冗余的doRun() ,您可能會有候選人。
  • 您的對象的狀態超出了生成器函數的預期。
  • 您的對象包裝,模擬或抽象函數的概念。
  • 您的對象具有其他輔助方法,這些方法在概念上屬於您的主要行為。

我喜歡的一個例子是UI命令對象。 設計的目的是讓他們的主要任務是執行comnand,但是使用額外的方法來控制他們的顯示作為菜單項,例如,在我看來,這仍然是你仍然想要一個可調用對象的東西。

如果您需要對象可以調用,請使用它,這就是它的用途

我不確定你的默認行為是什么意思

我發現它特別有用的一個地方是使用包裝器或某些框架/庫內深度調用對象的地方。

更一般地說,Python有很多雙下划線方法。 它們存在的原因是:它們是重載運算符的Python方式。 例如,如果你想要一個新的類,我不知道,打印"foo" ,你可以定義__add____radd__方法。 關於這一點沒有任何本質上的好或壞,除了使用for循環有任何好處或壞處之外。

事實上,使用__call__通常是更多Pythonic方法,因為它鼓勵代碼清晰。 你可以取代MyCalculator.calculateValues( foo )MyCalculator( foo ) ,說。

它通常在類被用作具有某些實例上下文的函數時使用,例如一些將用作@DecoratorClass('some param') DecoratorClass,因此'some param'將存儲在實例的命名空間中,然后實例被稱為實際裝飾。

當你的類提供一些不同的方法時它並不是很有用,因為它通常不明顯調用會做什么,而在這些情況下,顯式優於隱式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM