スタックオーバーフローに関する別の質問へのコメントでは、PythonはRubyのように、「すべてがオブジェクト」に関連しており、Python=はオブジェクトでした、Rubyと同じように。
これは本当ですか? pythonのオブジェクトはすべてルビーのようですか?
この点で2つはどのように違うのですか、それとも本当に同じですか?たとえば、あなたは数を取り、Ruby私が見たようなものを行うことができます:
y = 5.plus 6
Pythonでも同じようにできますか?
Python=のすべてがオブジェクトであり、ほとんどすべてが属性とメソッドを持っています。すべての関数には組み込みの属性
__doc__
があり、関数のソースコードで定義されたドキュメント文字列を返します。 sysモジュールは、(とりわけ)パスと呼ばれる属性を持つオブジェクトです。それでも、これは疑問を投げかけます。オブジェクトとは何ですか?異なるプログラミング言語は、異なる方法で「オブジェクト」を定義します。場合によっては、すべてのオブジェクトに属性とメソッドが必要であることを意味します。その他では、すべてのオブジェクトがサブクラス化可能であることを意味します。 Pythonでは、定義は緩くなっています。一部のオブジェクトには属性もメソッドもありません(これについては第3章で詳しく説明します)。すべてのオブジェクトがサブクラス化できるわけではありません(これについては第5章で詳しく説明します)。ただし、変数に割り当てたり、関数の引数として渡すことができるという意味では、すべてがオブジェクトです(詳細は第4章を参照)。
Pythonと同様に、Rubyでも...すべてがオブジェクトです
つまり、Rubyの独自のWebサイトから入手できます。Pythonでは、すべてがオブジェクトです。
すべてがPythonのオブジェクトですが、名前を解決してオブジェクトと対話する方法がRubyとは異なります。
たとえば、RubyはObject基本クラスで 'to_s'メソッドを提供しますが、その機能を公開するために、Pythonはそれを文字列に統合します型自体-型を文字列に変換して文字列に変換する_5.to_s
_の代わりにstr(5)
を使用します。
だまされてはいけません。舞台裏にはまだメソッドがあります-これがこのコードが機能する理由です:
_(5).__str__()
_
したがって、実際には2つは基本的に似ていますが、使い方は異なります。 Pythonのリストやタプルなどのシーケンスの長さは、この原理の別の例です-実際の機能は、特別な名前のメソッドに基づいて構築されていますが、よりシンプルで使いやすいインターフェースを通じて公開されています(len
関数)。
pythonあなたがあなたの質問に書いたものと同等なので、こうなるでしょう:
_(5).__add__(6)
_
重要なもう1つの違いは、グローバル関数の実装方法です。 Pythonでは、グローバルは(ローカルと同様に)辞書で表されます。これは、次のことを意味します。
_foo(5)
_
Pythonではこれと同等です。
_globals()["foo"].__call__(5)
_
Rubyはこれを効果的に行いますが、
_Object.foo(5)
_
これは、両方の言語でコードを記述するときに使用されるアプローチに大きな影響を与えます。 Rubyライブラリは、Objectなどの既存の型にメソッドを追加することで成長する傾向がありますが、Pythonライブラリは、特定のモジュールにグローバル関数を追加することで成長する傾向があります。
「すべて」は、PythonとRuby-たとえば、if
は「オブジェクト」ではありません)のどちらでも、少し高すぎます。ではなく、条件文または(Pythonで)リスト内包表記とジェネレータ式を開始するために使用されるキーワードです。その関数、クラス、メソッド、および実際にはオブジェクトではないあらゆる種類のことを見つける熱意(たとえば、 )C++はRubyまたはPythonのオブジェクトであり、そのような熱意を引き起こします。他のものはRubyではなく、Python =またはその逆(コードブロック、正規表現など)。
2番目の質問に答えて、はい:
>>> (1).__add__(2)
3
うん、私が知る限り、すべてがPythonのオブジェクトです。確かに、プリミティブ型と組み込み型(int、long、str、floatなど)はサブクラス化できます。実際、型自体はオブジェクトです。関数はオブジェクト、クラスはオブジェクト、コードブロックもある意味でオブジェクトです...オブジェクトとして扱うことができないPythonには何も思いつきません。
他の人の優れた答えにコメントを追加するには:すべてがオブジェクトですが、一部(特に文字列と数値型)は不変です。つまり、これらの型は、CやJava(整数などはオブジェクトではありません))のような言語での動作と同じように動作し、代入やパラメーターの受け渡しなどが行われます。参照渡しによって引き起こされるトラップを心配してください。これはかなり良い解決策です:-)