Каковы недостатки использования Python вместо Objective-C?

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

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

Ответы

Ответ 1

Да.

С одной стороны, как вы заметили, вся документация написана для 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). Как показывает Дэвид Бэзли в этом видео, это холодный, тяжелый факт; там не отрицаю этого.

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

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

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

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

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

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

Ответ 2

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

Как хранитель PyObjC для почти 15 лет, я скажу это прямо. использование Objective-C. Вам нужно будет знать Objective-C, чтобы действительно понять Cocoaв любом случае и PyObjC просто собирается добавить слой ошибок и проблем, которые чуждо 99% программистов Cocoa.

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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

Итак, сначала изучите ObjC. Если в вашем втором или третьем проекте или в год по дороге вы начинаете проект, для которого нужен модуль Python (например, Twisted или SQLAlchemy). Но для СЕРЬЕЗНОЙ потребности, такой как основа вашего приложения, требуется дополнительный стимул ваше приложение получает все, что стоит), тогда вы можете написать приложение PyObjC и получить много преимуществ по скорости этого языка, с фоном в Cocoa.

Ответ 7

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

Другими словами, PyObjC + Python - это не единственный способ разработки Mac с Python.

Ответ 8

Нет, вам не нужно знать Objective C, вам не нужно использовать PyObjC, и вы не станете вторым классом.

Если вы не хотите делать что-то чрезвычайно специфичное для платформы MAC, кодирование в Objective C или использование PyObjC - это действительно плохая идея.

Причина очевидна, как только вы идете по маршруту objc, вы говорите большое "прощание" с другими платформами. Это так просто.

Apple не хочет, чтобы вы кодировали для других платформ так же, как Microsoft не хочет, чтобы вы кодировали для других платформ. И поэтому все больше и больше разработчиков обращаются к языкам с открытым исходным кодом, таким как python, java, ruby ​​и т.д. Поскольку вам не важно, что Apple и Microsot, вам все равно, что приложение является самым полезным и простым в разработке. И сделать ваше приложение доступным только для MAC сделает его менее полезным, и очевидно, что разработка в Objective C намного сложнее.

Python имеет более чем достаточно библиотек для размещения вас, hundrends из них, легко доступных для платформы Mac. Я, например, разработал новое приложение в pygame, но это не игра, если я сделал то же самое в ObjC или PyObj, мне пришлось бы переписать код для окон и linux. Хотя с pygame мой код работает точно так же в windows и linux, хотя моя основная платформа - это macos.

Это привлекательность большинства библиотек python, они являются кросс-платформенными. WxPython - еще один пример: кто-то сказал, что "он не совсем выглядит изначально", не хотите ли вы, чтобы это не позволяло вашему приложению иметь доступ к окнам и Linux. Зачем ограничивать себя только на платформе MAC? Как вы думаете, средний пользователь будет заботиться о том, как изначально будет выглядеть ваше приложение. Даже приложения macos не выглядят родными, многие из них представляют свои собственные "глазные конфеты" gui. Не то, чтобы вы не могли заставить WxPython выглядеть на 100% родным, так как вы код всегда importnat.

Objc имеет смысл, когда вы намереваетесь разрабатывать для Iphone OS, так как Apple считала отличной идеей исключить python (и не только python), хотя они были вынуждены включать javascript (иначе websurfing был бы кошмаром на iphoneos). Pajamas, может сделать python доступным и для iphone os (без хаков или джейлбрейковых телефонов), но с очевидными ограничениями, поскольку он переводит код python в javascript, но все же его действительное решение, пока Apple не решит, что исключение python из iphone os - это действительно плохая идея.

текст ссылки

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

Но, чтобы быть абсолютно искренним с вами, если мое приложение заходит в тупик с библиотеками python (очень маловероятный сценарий), я бы предпочел бы обернуть существующие библиотеки C/С++ с помощью кросс-платформы с Cython, чем перейти к объективному маршруту c pyobjc и отмените способность кроссплатформенности моего приложения. Последнее, что я буду использовать, - это что-то конкретное platoform.

Теперь, если вы вообще не заботитесь о других платформах, я думаю, что Objective C может быть допустимым выбором. Это, безусловно, выглядит уродливо, как черт, но я слышал, что он становится намного лучше, чем больше вы его используете, и есть много людей, которые предпочитают его над C/С++.