Каковы оборотные стороны использования Python вместо Objective C? [закрытый]

Я знаю некоторый Python, и я действительно впечатлен простотой использования языка. Из того, что я видел Objective C, это выглядит намного менее симпатичным, но это, кажется, лингва франка для разработки Mac OS X (что означает, что это имеет лучшую документацию).

Я думаю о запуске разработки Mac - будет с помощью PyObjC+Python сделать меня гражданином второго класса?

13
задан Omnifarious 2 February 2010 в 02:41
поделиться

7 ответов

Да.

Во-первых, как вы заметили, вся документация написана для 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: принимает указатель на переменную-указатель, и метод сохранит объект в этой переменной (это называется return- по ссылке). Python не имеет указателей, поэтому способ обработки таких аргументов мостом заключается в том, что вы передаете None, а метод (кажется) возвращает кортеж. Итак, правильный пример:

movie, error = QTMovie.movieWithURL_error_(URL, None)

Вы можете увидеть, как даже простой пример отличается от того, что может показать вам документация в Objective-C.

Есть и другие проблемы, такие как GIL. Какао-приложения станут только более параллельными, и вы захотите в этом участвовать, особенно с такими заманчивыми классами, как NSOperation. И GIL является серьезным препятствием, особенно на многоядерных машинах . Я сам говорю это как специалист по Python (когда не пишу для Cocoa). Как демонстрирует Дэвид Бизли в этом видео, это холодный, твердый факт; это нельзя отрицать.

Итак, если бы я собирался отказаться от Objective-C для своих приложений, я бы взял MacRuby . В отличие от PyObjC и RubyCocoa, сообщения объектам Какао не пересекают языковой мост; это с нуля реализация Ruby в Какао с языковыми расширениями для лучшей поддержки написания кода Какао в нем.

Но это слишком далеко впереди. Вы только начали. Начните с Objective-C. Лучше избегать всех несоответствий импеданса между языком, который вы используете, и тем, для которого написана документация, сохраняя их на одном языке.

Кроме того, вы обнаружите, что некоторые ошибки (например, сообщения умершим объектам) труднее диагностировать, не зная, как работает Objective-C. Вы будете писать эти ошибки как новый программист на Какао, независимо от того, на каком языке вы пишете код.

Итак, изучите C, а затем изучите Objective-C. Практическое знание того и другого не займет больше нескольких недель, и в конце вы будете лучше подготовлены ко всему остальному.

Я не буду вдаваться в подробности, как я выучил C; достаточно сказать, что я не рекомендую то, как я это делал. Я слышал, что эта книга хорошая, но я никогда не владел ею и не читал. У меня есть эта книга , и я могу подтвердить, что она хороша, но также не предназначена для Mac; пропустите главу о том, как скомпилировать код, и вместо этого используйте Xcode.

Что касается Objective-C: Книга Хиллегасса является самой популярной, но я не использовал ее. (Я просмотрел его, и он выглядит неплохо.) Я прочитал документ Apple по языку , а затем сразу же приступил к написанию небольших приложений Cocoa. Я читал некоторые из руководств , но результаты были неоднозначными. Существует учебник по конвертеру валют , но он мне совсем не помог и не совсем отражает современное приложение Cocoa. (Современные приложения по-прежнему используют выходы и действия, но также и привязки, а реалистичный конвертер валют - это почти целиком пара привязок.)

36
ответ дан 1 December 2019 в 17:24
поделиться

Гражданин второго класса кажется немного сильным. API Objective-C доступны из Python, если они вам нужны, и это в основном, если вы хотите создать приложения Cocoa. Но тогда они ограничены OS X в любом случае. Лично я не интересуюсь строительным приложениям, которые не являются кроссплатформой, но это я. Это также означает, что я на самом деле не сделал это, поэтому я не знаю, насколько это сложно, но была статья в журнале Python не так давно, и она не выглядела ужасно.

Основным недостатком Python является время исполнения, и в основном происходит от него динамический язык. Это можно решить с помощью Cython и C-расширений и т. Д., Но затем вы получаете смесь Python + Objectivec API + Cython, который может быть непростой.

Так что это зависит от того, какие приложения вы собираетесь сделать. Что-то уникально OSX-ISH, которое не имеет никакого смысла нигде? Objectivec, вероятно, билет. Кроссплатформенные серверы, ну тогда Python Rocks! Что-то другое? Тогда это зависит.

2
ответ дан 1 December 2019 в 17:24
поделиться

Это действительно говорит все:

как сопровождающий Pyobjc для почти 15 лет, я скажу это прямо. Использовать Целью-с. Вам нужно будет знать Объектив-C, чтобы понять какао в любом случае, и Pyobjc просто собирается добавить слой ошибок и проблем, которые иностранец до 99% какао-программистов.

Комментарий в ответ на этот вопрос . Это вопрос также интересен.

18
ответ дан 1 December 2019 в 17:24
поделиться

НЕ ПРИНИМАЙТЕ ВНИМАНИЕ , чтобы избежать цели обучения - если вы собираетесь писать приложения для Mac. Цель PyObjC и других языковых связок - позволить вам повторно использовать существующие библиотеки в ваших приложениях, а не уклоняться от изучения родных утилит.

3
ответ дан 1 December 2019 в 17:24
поделиться

Вам понадобится Objective-C: это то, в чем написаны все учебники, документация, примеры кода, и все, что написано. В дополнение к дикому разнообразию людей, которые смогут вам помочь.

Так что сначала изучите Objective-C. Если, на вашем втором или третьем проекте, или через год после него, вы начинаете проект, которому нужен модуль Python (например, Twisted или SQLAlchemy). Но SERIOUS потребность, как основа вашего приложения, где дополнительный прирост получает ваше приложение делает все стоит), то вы можете написать PyObjC приложение и получить много быстрых преимуществ этого языка, с вашим фоном в Cocoa.

0
ответ дан 1 December 2019 в 17:24
поделиться

Это то, что я сам себе задавался вопросом, и хотя я надеюсь, что кто-нибудь придет с большим опытом, из того, что я знаю, вы не будете серьезно ограничены самим Питоном. Наряду с Java и GCC, Python является отличным способом написания нативных кроссплатформенных приложений. Как только вы освоите его, вы сможете сопоставить пример кода на объекте C с кодом на вашем Python.

Так как у вас есть доступ ко всем библиотекам и событиям, все, что вы можете сделать в Objective C, будет на Python. Конечно, чем больше вызовов и функций вы используете только для OS X, тем проще будет перенести их на другую платформу, но не в этом дело. Обычно программирование графики и работа с драйверами устройств несколько ограничивает - но в обоих случаях я нахожу свидетельства хорошей поддержки и работы с общими библиотеками (поиск Python и Quartz, Lightblue, libhid, PyUSB, для некоторых примеров).

Решающим фактором для меня будет: какой уровень поддержки инструментария и IDE необходим. Apple предоставляет отличное программное обеспечение для сборки нового программного обеспечения, но опять же, с чем-то вроде Pydev, у вас есть отличное место и для написания кода на Python! http://pydev.org/

Так что попробуйте, я уверен, что вы не пожалеете об этом, и там будет сообщество поддержки, к которому можно обратиться за помощью и пониманием.

0
ответ дан 1 December 2019 в 17:24
поделиться

В качестве дополнительной возможности учтите, что wxPython может создавать довольно хорошие приложения на Mac, а также в Linux и Windows. По большей части вы можете получить естественный внешний вид, но сохранить переносимость, практически не обращая внимания на специфические для платформы проблемы.

Другими словами, PyObjC + Python является не единственным способом разработки Mac с помощью Python.

0
ответ дан 1 December 2019 в 17:24
поделиться