python - 使用 Python 而不是 Objective-C 的缺点是什么?

标签 python cocoa macos pyobjc

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

1年前关闭。




Improve this question




我知道一些 Python,我对这种语言的易用性印象深刻。从我所看到的 Objective-C 来看,它看起来不那么漂亮,但它似乎是 Mac OS X 开发的通用语言(这意味着它有更好的文档)。

我正在考虑开始 Mac 开发——使用 PyObjC+Python 会让我成为二等公民吗?

最佳答案

是的。

一方面,正如您所注意到的,所有文档都是为 Objective-C 编写的,这是一种非常不同的语言。

一个区别是方法名称。在 Objective-C 中,当您向(Python 会说“调用一个方法”)一个对象发送消息时,方法名称(选择器)和参数是混合的:

NSURL *URL = /*…*/;
NSError *error = nil;

QTMovie *movie = [QTMovie movieWithURL:URL
    error:&error];

这在 Python 中是不可能的。 Python 的关键字参数不算作方法名称的一部分,因此如果您这样做:
movie = QTMovie.movieWithURL(URL, error = ???)

你会得到一个异常,因为 QTMovie 类没有名为 movieWithURL 的方法。 ; Objective-C 示例中的消息使用选择器 movieWithURL:error: . movieWithURL:movieWithURL将是另外两个选择器。

他们无法改变这一点,因为 Python 的关键字参数没有排序。假设您有一个假设的三参数方法:
foo = Foo.foo(fred, bar=bar, baz=baz)

现在,这叫 foo:bar:baz: , 对?

没那么快。 Foo 也可能有一个名为 foo:baz:bar: 的方法.由于 Python 的关键字参数没有排序,因此您实际上可能正在调用该方法。同样,如果您尝试拨打 foo:baz:bar: ,您实际上可能最终会拨打 foo:bar:baz: .实际上,这种情况不太可能发生,但如果发生了,您将无法可靠地调用任一方法。

因此,在 PyObjC 中,您需要像这样调用方法:
movie = QTMovie.movieWithURL_error_(URL, ???)

您可能想知道 ???。 C 不允许多个返回值,因此,在 Objective-C 中,error:参数接受一个指向指针变量的指针,该方法将在该变量中存储一个对象(这称为按引用返回)。 Python 没有指针,因此桥接器处理这样的参数的方式是传递 None,并且该方法将(似乎)返回一个元组。所以正确的例子是:
movie, error = QTMovie.movieWithURL_error_(URL, None)

您可以看到即使是一个简单的示例也与可能在 Objective-C 中向您展示的文档有所不同。

还有其他问题,例如 GIL。 Cocoa 应用程序只会变得更多并发,你会想要参与其中,尤其是像 NSOperation 这样诱人的类。和 the GIL is a serious liability, especially on multi-core machines .我自己是作为一个 Python 人这么说的(不为 Cocoa 写作时)。正如 David Beazley 在该视频中所展示的那样,这是一个冷酷的事实;无可否认。

所以,如果我要为我的应用程序从 Objective-C 切换,我会选择 MacRuby .与 PyObjC 和 RubyCocoa 不同,Cocoa 对象的消息不会跨越语言桥;它是 Cocoa 中从头开始的 Ruby 实现,具有语言扩展以更好地支持在其中编写 Cocoa 代码。

但这离你太远了。你才刚刚开始。从 Objective-C 开始。最好避免您使用的语言和文档编写的语言之间的所有阻抗不匹配,方法是让它们保持相同的语言。

另外,如果不了解 Objective-C 的工作原理,您会发现一些错误(例如发送给已故对象的消息)更难诊断。无论您使用哪种语言编写代码,您都将以新的 Cocoa 程序员的身份编写这些错误。

所以,先学C,再学Objective-C。掌握两者的工作知识应该不会超过几周,在它结束时,您将为其他一切做好更好的准备。

我不会讨论我是如何学习 C 的;我只想说我不推荐我这样做的方式。我听说this book很好,但我从未拥有或阅读过。我有 this book , 并且可以确认它很好,但它也不是特定于 Mac 的;跳过有关如何编译代码的章节,而使用 Xcode。

至于Objective-C:The Hillegass book是最受欢迎的,但我没有使用它。 (我略读了它,看起来不错。)我读了 Apple's document on the language ,然后直接开始编写小型 Cocoa 应用程序。我读了一些 the guides ,结果喜忧参半。有a Currency Converter tutorial ,但它根本没有帮助我,也不能完全反射(reflect)现代 Cocoa 应用程序。 (现代应用程序仍然使用导出和 Action ,但也使用绑定(bind),而一个现实的货币转换器几乎完全是几个绑定(bind)。)

关于python - 使用 Python 而不是 Objective-C 的缺点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2175573/

相关文章:

python - 寻找 "right"方法在 numpy 中做一系列矩阵向量产品

python - 为什么 scapy 在 Mac 上安装失败?

swift - 使用动画隐藏 NSStackView 的 View 项

objective-c - 在 Objective-C 中访问大文件,在执行操作时挂起程序的其余部分

c - 带有 Json-C 的架构 x86_64 的 undefined symbol

python - 从 scipy 导入 linprog 模块

swift - NSTextView 示例中带有 NSTextList 的项目符号列表?

windows - Jenkins Windows Master 连接到 Slave Mac OSX

macos - 如何查明我的 .app 实例是否已在运行?

python - PhantomJS 和 Python : Kill current driver open new one error