首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python/PyObjC中继承NSPanel?

如何在Python/PyObjC中继承NSPanel?
EN

Stack Overflow用户
提问于 2013-02-26 22:40:40
回答 1查看 222关注 0票数 1

我正在将Objective/Cocoa的一个小库移植到Python/PyObjC中。我对实现的方式很困惑。

原始代码如下所示:

代码语言:javascript
复制
@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。就我所读的代码而言,初始化是这样的进展:

  1. HUDWindow的initContentRect胜过NSPanel的initContentRect。
  2. 在HUDWindow的initContentRect中,NSPanel的initContentRect被调用并以"self“的形式得到结果。

首先,我编写这样的python代码。这是逐字翻译的:

代码语言:javascript
复制
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代码中移植的任何上瘾函数。

所以我就这样修改了代码:

代码语言:javascript
复制
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

效果更好一点。至少,我可以在这个初始化函数中调用其他函数。但是在初始化函数之外,我不能调用从原始代码移植的其他函数。

所以我就这样做了:

代码语言:javascript
复制
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这样的类吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-26 23:06:55

你的第一个解决方案是在正确的道路上。在第二种情况下,您需要使用NSProxy或编写自己的显式委托,这是一种痛苦(第三种方法不是这样做的--您可以通过swizzling做类似的事情,但不要这样做)。

然而,也有一些问题。

首先,这个代码:

代码语言:javascript
复制
self = NSPanel.initWithContentRect_styleMask_backing_defer_(rect, NSBorderlessWindowMask, buf, flag)

…等效于此ObjC代码:

代码语言:javascript
复制
self = [NSPanel initWithContentRect:rect 
                          styleMask:NSBorderlessWindowMask
                            backing:buf
                              defer:flag]

…当你想要的是:

代码语言:javascript
复制
self = [super initWithContentRect:rect 
                        styleMask:NSBorderlessWindowMask
                          backing:buf
                            defer:flag]

后者的PyObjC等价物是:

代码语言:javascript
复制
self = super().initWithContentRect_styleMask_backing_defer_(rect, NSBorderlessWindowMask, buf, flag)

或者,在2.x中:

代码语言:javascript
复制
self = super(HUDWindow, self).initWithContentRect_styleMask_backing_defer_(rect, NSBorderlessWindowMask, buf, flag)

在ObjC中,super不是超类,而是一个特殊的魔术对象,它实际上是“自我作为超类的一个实例”。它几乎完全类似于Python3的super(),或者不太神奇的Python2 super,PyObjC做了额外的工作,这意味着您可以忽略这个“几乎”。

您所做的是(尝试)初始化NSPanel类对象(或者可能是PyObjC桥到NSPanel的类对象,我不确定是哪个),甚至可能尝试将rect初始化为一个NSPanel。无论您在做什么,它都不可能对您的self实例进行初始化。(并且将结果分配给self不像在ObjC中那样。在PyObjC中,它仍然是惯用的风格,但不要被它误导;它唯一的效果是如果您在初始化器方法中再次使用self。无论如何,最好是用ObjC来掩盖问题,而不是修复…)因此,在从该方法返回之后,您的self仍然是调用任何内容之前所分配但未初始化的NSPanel实例。

在本教程的早期,两相实例化中主要解释了这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15100827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档