Я портирую небольшую библиотеку Objective-C/Cocoa в Python/PyObjC. И я смущаюсь о том, как реализовать.Как наследовать NSPanel в 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. Насколько я прочитать код, инициализировать прогресс, как это:
- initContentRect HUDWindow переопределению initContentRect NSPanel в.
- Внутри initContentRect HUDWindow вызывается initContentRect от NSPanel и получает результат как «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?
Спасибо @abamert! Ваш ответ содержит все, что я хочу (и нужно) знать! Я не могу не сказать «Эврика!». – user2100702