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

时间:2010-02-01 09:01:26

标签: python cocoa macos pyobjc

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

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

8 个答案:

答案 0 :(得分:36)

首先,正如您所注意到的,所有文档都是针对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,但它根本没有帮助我,并没有完全反映现代的Cocoa应用程序。 (现代应用程序仍然使用插件和操作,但Bindings和现实的货币转换器几乎完全是几个Bindings。)

答案 1 :(得分:18)

这真的说明了一切:

  

作为PyObjC的维护者几乎   15年,我会直言不讳地说。使用   Objective-C的。你需要知道   Objective-C真正了解Cocoa   无论如何,PyObjC只是要添加   一层虫子和问题是   对99%的Cocoa程序员来说是陌生的。

this question的回答中的评论。 This问题也很有趣。

答案 2 :(得分:3)

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

答案 3 :(得分:2)

二等公民似乎有点强大。如果您需要,Objective-C API也可以从Python获得,而且主要是如果您想制作Cocoa应用程序。但是他们无论如何都被限制在OS X.就个人而言,我没有兴趣构建非跨平台的应用程序,但那就是我。这也意味着我实际上并没有这样做,所以我不知道它有多棘手,但不久前Python杂志上有一篇文章,看起来并不那么可怕。

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

所以这取决于你要制作什么类型的应用程序。独一无二的OSX-ish在其他任何地方都没有意义? ObjectiveC可能是票。跨平台服务器,然后是Python摇滚!别的什么?然后它取决于。

答案 4 :(得分: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/

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

答案 5 :(得分:0)

您将需要Objective-C:这就是所有教程,文档,示例代码和所有内容的编写内容。除了各种各样的人能够帮助您之外。

首先学习ObjC。如果,在你的第二个或第三个项目,或者一年之后,你开始一个需要Python模块的项目(比如说,Twisted或者SQLAlchemy。但是需要像你的应用程序的基础那样的严峻需求,额外的提升你的应用程序让一切变得有价值),然后你可以编写一个PyObjC应用程序,并获得该语言的许多速度优势,以及你在Cocoa的背景。

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

不,你不需要知道Objective C你不需要使用PyObjC,你就不会成为第二类citizent。

除非你想做一些非常特定于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(否则websurfing会成为一个噩梦iphoneos)。睡衣,可以让python可用于iphone操作系统(没有黑客或越狱手机),但有明显的限制,因为它将python代码转换为javascript,但仍然是一个有效的解决方案,直到Apple决定从iphone os排除python是一个真的很糟糕。

link text

虽然研究目标C没有任何危害。您始终可以通过pyobjc使用本机库。

但是对你绝对诚恳,如果我的应用程序与python库达到了死胡同(一个非常不可能的场景),我宁愿用Cython包装一个现有的跨平台C / C ++库,而不是去目标c pyobjc路由和破坏我的应用程序的跨平台能力。我将使用的最后一件事是平台特定的任何东西。

现在如果你根本不关心其他平台,那么我猜Objective C可能是一个有效的选择。它当然看起来很难看,但是我听说你使用它的次数越多越好,并且有很多人比C / C ++更喜欢它。