我想做的就是用Cocoa GUI创建相对简单的Python应用程序。有没有人能解释一下可怕的文档,或者指导我一些不仅给你巨大的代码块并且假设你知道NSThread.detachNewThreadSelector_toTarget_withObject_("queryController", self, None)是什么的教程..?
基本上,我只是想写Cocoa应用程序,而不必学习ObjC。
虽然我基本上同意Soeren的回答,但我会更进一步:
在没有理解Objective C的情况下,您很长时间甚至永远无法使用Cocoa。Cocoa不是独立于Objective C构建的抽象,它明确地与之相关联。您可以在上面引用的示例代码行中看到这一点:
NSThread.detachNewThreadSelector_toTarget_withObject_("queryController", self, None)
这是用Python编写Objective C代码的方法:
[NSThread detachNewThreadSelector:@selector(queryController:) toTarget:self withObject:nil]
现在需要注意的是,这一行可以从两个角度看待:(1)作为Objective C的一行代码,或者(2)作为Cocoa框架的调用。通过语法,我们将其视为(1)。通过识别NSThread是一个提供一组方便功能的Cocoa框架,我们将其视为(2)。在这种情况下,这个特定的Cocoa框架使得我们很容易让一个对象在新线程上开始执行某些操作。
但问题在于:这里的Cocoa框架(NSThread)以一种明确与框架所编写的语言相关的方式为我们提供了这个方便的服务。也就是说,NSThread给我们提供了一个明确引用“选择器”的功能。事实上,选择器是Objective C如何工作的一项基本内容。
因此,这就是问题所在。Cocoa基本上是Objective-C创建的,其创建者已经考虑到了Objective-C。我并不是说将Cocoa功能接口翻译成对其他语言更自然的形式是不可能的。只是一旦你改变了Cocoa框架,让它不再引用“选择器”,它就不再是真正的Cocoa框架了。它是一个翻译版本。一旦你开始走这条路,我猜想事情会变得非常混乱。你试图跟上苹果更新Cocoa的步伐,也许你会遇到一些无法很好地翻译成新语言的Cocoa部分。因此,像PyObjC这样的东西选择直接暴露Cocoa,以一种非常清晰和简单的相关性方式。正如他们在文档中所说:
为了在Objective-C消息和Python方法之间进行无损和明确的转换,Python方法名等效于带有下划线替换冒号的选择器。
当然,这有点丑陋,而且这意味着你需要了解一些Objective-C,但这是因为另一种选择,如果真的存在,未必更好。