我想做的就是使用 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)
这是编写 Objective C 行的 Python 方式:
[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 框架了。是翻译版本。一旦你开始走这条路,我猜事情会变得非常混乱。您正在努力跟上 Apple 更新 Cocoa 的步伐,也许您遇到了 Cocoa 的某些部分,这些部分只是不能很好地翻译成新的语言,无论如何。所以相反,像 PyObjC 这样的东西选择直接公开 Cocoa,以一种非常清晰和简单的相关性。正如他们在文档中所说:
为了在 Objective-C 消息和 Python 方法之间进行无损且明确的转换,Python 方法名称等价物只是将冒号替换为下划线的选择器。
当然,它有点难看,它确实意味着你需要了解一些关于 Objective-C 的知识,但那是因为替代方案,如果真的存在,不一定更好。