現在,我瞭解你的設計,你會發現一切都是錯誤的。
首先,Outer是一類;它沒有得到__call__
版。你的第17行正要構造一個空的Outer
對象,並且什麼也不做。如果你想「呼叫」對象,你可以定義一個__init__
方法,或者,正如Sheena所建議的那樣,定義一個__new__
並攔截初始化,因爲你實際上並不需要初始化對象。
老實說,我不認爲有人不明白__call__
是如何工作的,但應該嘗試構建一些棘手的問題。但如果你堅持,請繼續閱讀。
這是一個非常奇怪的,也許是壞的設計,收集這種類的東西在類而不是一個實例。請記住,類變量實際上是全局變量,包含所有這些變量。如果你嘗試使用Outer
或者從多個線程/事件處理程序/ greenlet /無論如何,這些使用將最終彼此跺腳。即使你認爲現在不會成爲問題,它可能會在未來某個時候。
您可以創建一個Outer
實例,並將其成員用作裝飾器。例如:
from outer_library import Outer
outer = Outer()
@outer.get("/")
…
但我不確定那會好很多。這裏的整個設計似乎涉及在模塊級別執行操作,即使看起來您只是定義普通函數並在最後調用函數。你設法混淆自己的事實應該是這種設計有多混淆的證據。
但如果你做想要做到這一點,你可能想要做的是定義Outer.__init__
方法內的類,並將它們分配給實例成員。類是一流的值,可以像任何其他值一樣分配給變量。然後,使用這些類的__init__
(或__new__
)方法來完成你想要的工作,使這些類模擬函數。
這似乎令人困惑或誤導。但請記住,你所要做的全部事情就是以一種看起來像一種方法的方式使用一個類,這樣就會產生這種混淆。但是,如果你願意,你可以編寫裝飾器作爲函數(在這種情況下,作爲Outer
的常規實例方法);它只是使問題的一個不同部分,而不是這部分。
設計類似這樣東西的一種更常見的方式是使Outer
成爲一個完全正常的類,人們可以創建子類或創建實例,並提供一種明確的非奇妙方式來將處理函數方法或函數附加到URL。然後,一旦工作,設計一種方法來簡化處理程序註冊與裝飾器。
爲什麼要使用一個嵌套類*在所有*? –
因此,我試圖讓Outer類包含將接受參數的裝飾器,最好的方法是將裝飾器寫成類http://stackoverflow.com/questions/10610824/python-shortcut-for-writing- decorator-which-accept-arguments – sri
是的,使用裝飾器的類是一個好主意,但這並不意味着你需要使用* nested *類。你想要解決什麼問題? –