Objective-C/Cocoaの小さなライブラリをPython/PyObjCに移植しています。そして、私は実装する方法について混乱しています。
元のコードは次のように始まります。
@implementation HUDWindow
- (id)initWithContentRect:(NSRect)contentRect
styleMask:(unsigned int)styleMask
backing:(NSBackingStoreType)bufferingType
defer:(BOOL)flag
{
if (self = [super initWithContentRect:contentRect
styleMask:NSBorderlessWindowMask
backing:bufferingType
defer:flag]) {
// initialize code here
:
:
:
:
:
:
return self;
}
}
また、ヘッダーファイルには、HUDWindowクラスがNSPanelを継承すると記載されています。私がコードを読んでいる限り、初期化は次のように進行しています。
- HUDWindowのinitContentRectは、NSPanelのinitContentRectをオーバーライドします。
- HUDWindowのinitContentRect内で、NSPanelのinitContentRectが呼び出され、結果が「self」として取得されます。
まず、このようなPythonコードを記述します。これは単語ごとの翻訳です:
class HUDWindow(NSPanel):
def initWithContentRect_styleMask_backing_defer_(self, rect, style, buf, flag):
self = NSPanel.initWithContentRect_styleMask_backing_defer_(
rect, NSBorderlessWindowMask, buf, flag)
# initialize code here
:
:
:
:
:
:
return self
self
はのインスタンスにすぎないため、機能しませんでしたNSPanel
。元のobj-cコードから移植した中毒性のある関数を呼び出すことはできません。
だから私は次のようにコードを変更しました:
class HUDWindow(NSPanel):
def initWithContentRect_styleMask_backing_defer_(self, rect, style, buf, flag):
self.window = NSPanel.initWithContentRect_styleMask_backing_defer_(
rect, NSBorderlessWindowMask, buf, flag)
# initialize code here
:
:
:
:
:
:
return self.window
それは少し良く機能しました。少なくとも、この初期化関数で他の関数を呼び出すことができます。しかし、初期化関数以外では、元のコードから移植された他の関数を呼び出すことはできません。
だから私はこのように試しました:
class HUDWindow(NSPanel):
def initWithContentRect_styleMask_backing_defer_(self, rect, style, buf, flag):
self.window = NSPanel.initWithContentRect_styleMask_backing_defer_(
rect, NSBorderlessWindowMask, buf, flag)
# initialize code here
:
:
:
:
:
:
self.window.setTitle_ = self.setTitle_
return self.window
うまくいきませんでした。インスタンスを作成した後、関数を上書きまたは追加できません。
今、私は完全に間違っていると感じています。NSPanelやNPWindowのようなクラスを継承する一般的な方法はありますか?