簡體   English   中英

在Jython中,我可以創建一個實現Java接口的內聯匿名類嗎?

[英]In Jython, can I make an inline anonymous class that implements a Java interface?

在Java中,我可以說

Thread t = new Thread(){
    public void run(){ // do stuff }
}

(或類似的東西)聲明一個內聯的匿名類。 這對於制作事件處理程序或其他回調類型的東西非常有用,在任何合理的語言中, 首先不需要對象擁有它們

我在Jython中面臨同樣的問題 - 我想定義一個事件處理程序,但我不想構建一個完整的獨立類來執行此操作。

理想情況下,我只能傳遞一個lambda並完成它,但如果這是可能的,我無法在文檔中的任何地方找到它。

以下是我原來答案中的背景閱讀鏈接:

閱讀: Python是否有類似Java的匿名內部類?

然后,請閱讀: Python是否有匿名類?

最后,請閱讀: 是否可以在Python中創建匿名對象?

[對原始助手的改進]

Jython在適當的時候隱式地將函數轉換為事件處理程序。 所以,你可以在你的一個方法中寫這個:

def _(self, event):
    print 'Cancel button was clicked!'
    if self.task is not None:
        self.task.cancel()
cancelButton.setOnAction(lambda event: _(self, event))

這種方法提供了匿名內部類的三個理想特征。

(1)高度本地化 處理程序代碼位於分配處理程序的代碼旁邊。

(2)它是自我意識的 ,意味着你有self並且可以訪問包含對象的所有成員。

(3)它(幾乎)是匿名的 Python強迫我為多行函數選擇一個名稱,但它也允許我重用該名稱。 因此,只要我立即使用它,我就可以定義多個稱為_本地函數。 (使用相同的名稱定義第二個函數會使第一個函數無法通過該名稱訪問。)因此,我沒有被迫發明ad-infinitum的唯一名稱。

你也可以在裝飾器中打包這個模式,我想稍微澄清一下這個意圖:

@LocalEventHandler(self, cancelButton.setOnAction)
def _(self, event):
    print 'Cancel button was clicked!'
    if self.task is not None:
        self.task.cancel()

裝飾器實現如下所示:

class LocalEventHandler(object):
    '''This decorator turns a local function into a *self aware* event handler.'''

    def __init__(self, context, assignHandlerFunc):
        self.context = context
        self.assignHandlerFunc = assignHandlerFunc

    def __call__(self, handler):
        self.assignHandlerFunc(lambda event: handler(self.context, event))
        return handler

暫無
暫無

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

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