私は Python をある程度知っており、その言語の使いやすさに本当に感銘を受けました。私が見たところ、Objective-C は見栄えが悪いように見えますが、Mac OS X 開発の共通語のようです (つまり、より良いドキュメントがあるということです)。
Mac での開発を始めようと考えています。PyObjC+Python を使用すると、二流市民になりますか?
はい。
1 つには、お気づきのように、すべてのドキュメントは、まったく異なる言語である Objective-C 用に書かれています。
1 つの違いはメソッド名です。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:
ます。他の 2 つのセレクターになりますmovieWithURL:
。movieWithURL
Python のキーワード引数は順序付けされていないため、これを変更する方法はありません。仮想的な 3 引数メソッドがあるとします。
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 アプリの作成に取り掛かりました。いくつかのガイドを読みましたが、結果はまちまちです。Currency Converter のチュートリアルがありますが、まったく役に立たず、最新の Cocoa アプリを完全に反映していません。(最新のアプリはまだアウトレットとアクションを使用していますが、バインディングも使用しています。現実的な通貨コンバーターはほぼ完全に 2 つのバインディングになります。)
Mac 用のアプリを作成する場合は、Objective-C の学習を避けようとしないでください。PyObjC とその他の言語バインディングの目的は、アプリで既存のライブラリを再利用できるようにすることであり、ネイティブ ツールの学習を回避できるようにすることではありません。
二等市民は少し強いようです。Objective-C API は、必要に応じて Python からも利用できます。これは主に、Cocoa アプリを作成する場合に必要です。ただし、いずれにせよ、それらは OS X に制限されます。個人的には、クロスプラットフォームではないアプリを構築することに興味はありませんが、それが私です。これは、私が実際にこれを行ったことがないということでもあるので、どの程度トリッキーなのかはわかりませんが、少し前に Python Magazine に記事がありましたが、それほどひどいものではありませんでした。
Python の主な欠点は実行時間です。これは主に Python が動的言語であることから来ています。これは、Cython や C 拡張機能などで解決できますが、Python + ObjectiveC API + Cython が混在しているため、困難な場合があります。
したがって、作成するアプリケーションの種類によって大きく異なります。他の場所では意味をなさない、独特の OSX っぽいものはありますか? ObjectiveC はおそらくチケットです。クロスプラットフォームのサーバー、それなら Python が最適です! 他の何か?それからそれは依存します。
Objective-C が必要になります。それは、すべてのチュートリアル、ドキュメント、サンプル コード、およびすべてが記述されているものです。さらに、非常に多様な人々があなたを助けることができます。
そのため、最初に ObjC を学びます。2 番目または 3 番目のプロジェクトで、または 1 年後に、Python モジュール (たとえば、Twisted や SQLAlchemy など) を必要とするプロジェクトを開始するとします。あなたのアプリはそれだけの価値があるものになります)、PyObjC アプリを作成し、Cocoa のバックグラウンドを使用して、その言語の多くの速度の利点を得ることができます。
追加のオプションとして、wxPythonは Linux や Windows だけでなく、Mac でもかなり優れたアプリケーションを作成できることを考慮してください。ほとんどの場合、ネイティブの外観を得ることができますが、プラットフォーム固有の問題にほとんどまたはまったく注意を払うことなく、移植性を維持できます。
つまり、 Mac 開発を Python で行う方法は PyObjC + Python だけではありません。
これは私自身が疑問に思っていることであり、誰かがより多くの経験を積んで来ることを願っていますが、私が知っていることから、Python 自体によって深刻な制約を受けることはありません。Java や GCC と同様に、Python はネイティブのクロスプラットフォーム アプリケーションを作成するための優れた方法です。コツをつかめば、Objective C のサンプル コードを Python コードにマッピングできるはずです。
すべてのライブラリとイベントにアクセスできるため、Objective C で実行できることはすべて Python でも実行できます。もちろん、OS X 専用の呼び出しや関数を使用すればするほど、別のプラットフォームへの移植が難しくなりますが、それは問題ではありません。通常、グラフィックス プログラミングとデバイス ドライバーの操作は制限要因の 1 つですが、どちらの場合も、優れたサポートとコミュニティ ライブラリの証拠を見つけています (例として、Python と Quartz、Lightblue、libhid、PyUSB を検索してください)。
私にとって決定的な要因は、必要なツールと IDE サポートのレベルはどれくらいかということです。Apple は新しいソフトウェアを構築するための優れたソフトウェアをいくつか提供していますが、Pydev のようなものを使用すると、Python コードを書くのにも最適な場所が得られます! http://pydev.org/
試してみてください。後悔することはないと確信しています。支援とインスピレーションを得るために利用できる支援コミュニティがあります。
いいえ、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 を使用すると、メインのプラットフォームが macos であるにもかかわらず、私のコードは Windows と Linux でまったく同じように動作します。
それがほとんどの python ライブラリの魅力であり、クロスプラットフォームです。WxPython は別の例です。誰かが「ネイティブに正確に見えるわけではない」と述べました。これにより、アプリケーションを Windows および Linux で使用できるようにするのをやめさせたいと思いますか? なぜ MAC プラットフォームだけに制限するのですか? 平均的なユーザーは、アプリがどれだけネイティブに見えるかを気にすると思いますか? MacOS アプリでさえネイティブに見えず、多くのアプリは独自の「目を楽しませてくれる」GUI を導入しています。WxPython を 100% ネイティブに見えるようにできないわけではありません。コーディング方法は常に重要です。
Objc は、Iphone OS 向けに開発する場合に意味があります。Apple は、javascript を含めることを余儀なくされていたとしても (Python だけでなく) Python を除外することをお勧めすると考えていたためです (そうしないと、iphoneos では Web サーフィンが悪夢になっていたでしょう)。Pyjamas は、python を iphone os でも利用できるようにすることができます (ハッキングやジェイルブレイクされた電話なしで)。ただし、python コードを javascript に変換するため、明らかな制限がありますが、Apple が iphone os から python を除外することが本当に悪い考えです。
ただし、Objective C を勉強しても害はありません。pyobjc を介していつでもネイティブ ライブラリを使用できます。
しかし、あなたに完全に誠実であるために、私のアプリがpythonライブラリで行き止まりに達した場合(非常にありそうもないシナリオ)、客観的なc pyobjcルートに行き、クロスを破壊するよりも、既存のクロスプラットフォームC / C ++ライブラリをCythonでラップしたいと思いますアプリのプラットフォーム機能。私が最後に使用するのは、プラットフォーム固有のものです。
他のプラットフォームをまったく気にしないのであれば、Objective C が有効な選択肢になると思います。確かに見栄えは悪いですが、使えば使うほど良くなり、C/C++よりも好きな人が多いと聞いています。