![](/img/trans.png)
[英]traceback behaviour for __init__ errors when using __call__ in metaclasses?
[英]When is using __call__ a good idea?
人們對使用__call__
的看法是什么。 我只是很少看到它使用,但我認為當你知道一個類將被用於某些默認行為時,它是一個非常方便的工具。
我認為你的直覺是正確的。
從歷史上看,OO世界中使用了可調用對象(或者我有時稱之為“仿函數”的對象)來模擬閉包。 在C ++中,它們經常是不可或缺的。
但是, __call__
在Python世界中有相當多的競爭:
我會說使用__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.