13

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

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

4

8 回答 8

37

是的。

一方面,正如您所注意到的,所有文档都是为 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 这样的诱人类。而且GIL 是一项严重的责任,尤其是在多核机器上。我自己是作为一个 Python 人这么说的(当不为 Cocoa 写作时)。正如 David Beazley 在该视频中所展示的那样,这是一个冷酷的事实;无可否认。

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

但这离你太远了。你才刚刚开始。从 Objective-C 开始。最好通过保持相同的语言来避免您使用的语言与编写文档的语言之间的所有阻抗不匹配。

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

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

我不会详细介绍我是如何学习 C 的。我只想说我不推荐我这样做的方式。我听说这本书很好,但我从未拥有或阅读过它。我确实有这本书,并且可以确认它很好,但它也不是 Mac 专用的;跳过关于如何编译代码的章节,使用 Xcode 代替。

至于 Objective-C:Hillegass 的书是最受欢迎的,但我没有使用它。(我浏览过它,它看起来不错。)我阅读了 Apple 关于语言的文档,然后直接开始编写小型 Cocoa 应用程序。我阅读了一些指南,结果喜忧参半。有一个货币转换器教程,但它根本没有帮助我,也不能完全反映现代 Cocoa 应用程序。(现代应用程序仍然使用出口和动作,但也使用绑定,而现实的货币转换器几乎完全是几个绑定。)

于 2010-02-01T10:21:28.953 回答
18

这真的说明了一切:

作为 PyObjC 近 15 年的维护者,我直言不讳。使用 Objective-C。无论如何,您都需要了解 Objective-C 才能真正理解 Cocoa,而 PyObjC 只会添加一层对 99% 的 Cocoa 程序员来说陌生的错误和问题。

对此问题的回答中的评论。这个问题也很有趣。

于 2010-02-01T09:53:42.810 回答
3

如果您要为 Mac 编写应用程序,请不要试图避免学习 Objective-C。PyObjC 和其他语言绑定的目的是让您在应用程序中重用现有库,而不是让您避免学习本机工具。

于 2010-02-01T11:10:02.443 回答
2

二等公民似乎有点强。Objective-C API 也可以从 Python 获得,如果你需要它们,那主要是如果你想制作 Cocoa 应用程序。但无论如何,它们都仅限于 OS X。就个人而言,我对构建非跨平台的应用程序没有兴趣,但这就是我。那也说明我还没有真正做到这一点,所以我不知道它有多棘手,但是不久前Python杂志上有一篇文章,看起来并没有那么可怕。

Python 的主要缺点是执行时间,这主要来自于它是一种动态语言。这可以通过 Cython 和 C-extensions 等来解决,但是你会得到 Python + ObjectiveC API + Cython 的组合,这可能会令人生畏。

所以这在很大程度上取决于你要制作什么样的应用程序。一些独特的 OSX-ish 在其他任何地方都毫无意义的东西?ObjectiveC 可能是门票。跨平台服务器,然后是 Python 摇滚!还有什么?然后就看情况了。

于 2010-02-01T10:10:06.577 回答
0

这是我自己一直在想的事情,虽然我希望有人有更多的经验,但据我所知,你不会受到 Python 本身的严重限制。与 Java 和 GCC 一样,Python 是编写本机跨平台应用程序的绝佳方式。一旦你掌握了它的窍门,你应该能够将 Objective C 中的示例代码映射到你的 Python 代码。

由于您可以访问所有库和事件,因此您可以在 Objective C 中执行的所有操作都将在 Python 中存在。当然,您使用的仅限 OS X 的调用和功能越多,移植到另一个平台就越不容易,但这不是重点。通常图形编程和使用设备驱动程序在某种程度上是一个限制因素 - 但在这两种情况下,我都找到了良好支持和社区库的证据(搜索 Python 和 Quartz、Lightblue、libhid、PyUSB,以获取一些示例)。

对我来说,决定性因素是:需要什么级别的工具和 IDE 支持。Apple 提供了一些很棒的软件来构建新软件,但是再次使用 Pydev 之类的软件,您也有一个编写 Python 代码的好地方!http://pydev.org/

所以试一试吧,我相信你不会后悔的,而且会有一个支持社区来寻求帮助和启发。

于 2010-02-01T09:58:45.273 回答
0

您将需要 Objective-C:这是所有教程、文档、示例代码和所有内容的编写内容。此外,还有更多人能够帮助您。

所以先学ObjC。如果,在您的第二个或第三个项目中,或者一年后,您启动了一个需要 Python 模块的项目(例如,Twisted 或 SQLAlchemy。但是您的应用程序需要一个非常重要的需求,例如需要额外的提升您的应用程序让一切都变得值得),然后您可以编写一个 PyObjC 应用程序并获得该语言的许多速度优势,并具有 Cocoa 的背景。

于 2010-02-01T12:30:39.470 回答
0

作为一个额外的选择,考虑到wxPython可以在 Mac 以及 Linux 和 Windows 上生成一些非常好的应用程序。在大多数情况下,您可以获得原生外观,但保持可移植性,很少或根本不关注特定于平台的问题。

换句话说,PyObjC + Python并不是使用 Python 进行 Mac 开发的唯一方法。

于 2010-02-02T06:39:26.407 回答
0

不,你不需要知道 Objective C 你不需要使用 PyObjC ,你不会成为二等公民。

除非你想做一些非常特定于 MAC 平台的事情,否则在 Objective C 中编码或使用 PyObjC 是一个非常糟糕的主意。

原因很明显,一旦你走 objc 路线,你就对其他平台说“再见”。就这么简单。

Apple 不希望您为其他平台编写代码,就像 Microsoft 不希望您为其他平台编写代码一样。这就是为什么越来越多的开发人员转向开源语言,如 python、java、ruby 等。因为你不在乎 Apple 和 Microsot 是什么,你只关心最有用和最容易开发的应用程序。并且使您的应用程序仅可用于 MAC 将使其不那么有用,并且显然在 Objective C 中开发更加困难。

Python 有足够多的库来容纳你,数百个,随时可用于 mac 平台。例如,我在 pygame 中开发了一个新应用程序,不,它不是游戏,如果我在 ObjC 或 PyObj 中做了同样的事情,我将不得不为 windows 和 linux 重写代码。虽然使用 pygame,我的代码在 windows 和 linux 中的工作方式完全相同,即使我的主要平台是 macos。

这就是大多数 python 库的吸引力,它们是跨平台的。WxPython 是另一个例子,有人提到“它看起来并不完全原生”,您是否希望这阻止您使您的应用程序可用于 windows 和 linux。为什么要限制自己只在MAC平台上?您认为普通用户会关心您的应用程序的原生外观吗?甚至 macOS 应用程序看起来也不是原生的,其中许多都引入了自己的“眼睛糖果”gui。并不是说你不能让 WxPython 看起来 100% 原生,你的编码方式总是很重要的。

当您打算为 Iphone OS 开发时,Objc 是有意义的,因为 Apple 认为排除 python(而不仅仅是 python)是一个好主意,即使它们被迫包含 javascript(否则网上冲浪将成为 iphoneos 上的噩梦)。Pyjamas,也可以使 python 可用于 iphone os(没有黑客或越狱手机),但由于它将 python 代码转换为 javascript,因此具有明显的局限性,但在 Apple 决定将 python 从 iphone os 中排除是一个有效的解决方案之前,它仍然是一个有效的解决方案真是个坏主意。

链接文本

不过,学习 Objective C 并没有什么坏处。您始终可以通过 pyobjc 使用本机库。

但是绝对真诚地对待你,如果我的应用程序在 python 库中遇到了死胡同(非常不可能的情况),我宁愿用 Cython 包装现有的跨平台 C/C++ 库,也不愿走目标 c pyobjc 路线并破坏十字架我的应用程序的平台能力。我将使用的最后一件事是任何特定于平台的东西。

现在,如果您根本不关心其他平台,那么我想 Objective C 可能是一个有效的选择。它看起来确实丑得要命,但我听说使用它的次数越多,它就会变得更好,而且有很多人更喜欢它而不是 C/C++。

于 2010-09-21T11:43:26.363 回答