2009-07-03 12 views
38

Pythonは私が最もよく知っている言語です。そして、不思議なことに、私はなぜJavaかPHPのように "自分"と "これ"を入力しているのか分かりません。なぜpythonistasは "this"ではなく、現在の参照を "self"と呼びますか?

私は、PythonがJavaより古いと知っていますが、どこから来たのか分かりません。特に "self"の代わりに任意の名前を使うことができるので、プログラムは正常に動作します。

このコンベンションはどこから来たのですか?

+5

「自分」の代わりに「この」を使用できます。ただし、シンタックスハイライトやコード検査ツールを混乱させる可能性があります。 「自己」を使うことは単なる慣例に過ぎません。 – balpha

+0

「自己」と「これ」の両方に4文字あるため、他の文字より優れているとは思われません。 – Jonathan

+0

私はそれを書いたばかりです。 –

答えて

63

Smalltalk-80(Xeroxが1980年にリリース)は、selfを使用しています。 Objective-C(1980年代初め)の層SmalltalkはCを超えているので、selfも使用されます。 Modula-3(1988)、Python(1980年代後半)、Ruby(1990年代半ば)もこの伝統に従います。

C++はまた、1980年代初めのもので、selfの代わりにthisを選択しました。 JavaはC/C++開発者には親しみやすいように設計されているので、thisも使用しています。

スモールトークは、メッセージをお互いに送信するメタファーを使用します。したがって、「自己」は、オブジェクトが自分自身にメッセージを送信していることを示します。

+10

Object Pascal(デルファイを含む、初期のAppleと後のBorlandの両方のフレーバー)も "自己"と一緒に行きました。 –

+7

SmalltalkとObjective-Cはどちらも、メッセージをお互いに送信するオブジェクトのメタファーを使用します。したがって、「self」は、オブジェクトが自分自身にメッセージを送信していることを示します。 (これはいつも "this"の代わりに "self"を使うのが自然だと思われます。) –

+3

自己を忘れてはいけません:) – akuhn

19

もちろん、Javaよりも前のSmalltalk。

+1

おかげで、今夜はよく眠れます。 –

+0

なぜこの答えが18 upvotesを持っているか分かりません。何か特別な理由?私はここに何かを逃していますか – Nabin

28

チェックユーザー定義のクラスのためのhistory of Pythonは:

代わりに、一つは単にその最初の引数規則によって命名されたインスタンスに対応し、機能を定義し、「自己を。」たとえば:

def spam(self,y): 
    print self.x, y 

このアプローチは、私 はのModula-3、すでに を持っていたインポートおよび例外処理の構文 を私に提供して見ていた何かに似ています。

他のどのような選択肢もあります。なぜC++、Java、およびC#が "this"を簡単に選択したのかを尋ねるかもしれません。

+2

申し訳ありませんが、本当にあなたは私が質問で言ったことを繰り返すだけです:Pythonは自己を使用しています、それは規約です。問題はその理由です。 –

+6

引用符とリンクは、Pythonのモチベーションの作成者を説明しています。それよりも良い理由を得るのは難しいでしょう。 Duffymoはあなたの質問を繰り返さない - Guidoはある。 –

+5

"Modula-3で見たことのあるもの..." - 私はそう言っていたので、 "Smalltalk"よりも多くのドキュメントを持っています。私は歴史の中の「私」がBDFL Guidoだと信じています。 – duffymo

5

明示的に宣言されているので、 "this"ではなく "self"という実際の引数を見ると意味があります。少なくとも文法的な観点からは、「自己」は「これ」ほど文脈依存ではありません。

私は自分自身を十分に明確にしたかどうかわかりませんが、とにかくこれは単なる主観的な感謝です。

7

主要インスピレーションのModula-3、グイドが12月でに導入した。

のModula-3の最終報告書は、ほぼ同時に存在 書き込まれていました。 私がそこで学んだことは、 Pythonの例外処理、モジュール、 にあり、メソッドが明示的に のパラメータに のリストに "self"を含むという事実がありました。

- グイド、Linux Journal Interviews Guido van Rossum

15

のpythonに関しては、selfに関する特別なものは何もありません。あなたが望んでいた場合は、代わりにthisを使用することができます。

をここに例を示します

>>> class A(object): 
... def __init__(this): 
...  this.x = 3 
... 
>>> a = A() 
>>> a.x 
3 

あなたはselfは、クラスの関数の最初の引数のための規則である、あなたは好きな名前を付けできたが。

多くの場合、メソッドの最初の引数はselfと呼ばれます。これは慣習以上のものではありません :名前自体は絶対に特別なものはありません Pythonの意味。ただし、規約に従わないと、他のPythonプログラマーにはコードが読みにくくなる可能性があります。 また、 はそのような規則に依存しているクラスブラウザープログラムが記述されている可能性があります。

これはSmalltalkから始まりましたが、Object Pascal、Python、Ruby、Objective-Cでも使用されています。 This answerには大きな説明があります。

+7

それは問題ではありませんでした。 –

+0

ありがとう@jterrace、私はPythonでも 'this'も使用できることに気づいていませんでした。あなたの説明も妥当です。 –

+1

この回答を前の大部分が同じ質問にまとめました。すぐに回答を返すことをお勧めします。 – Shog9

8

Pythonは、アスペクトでSmalltalkの足音に従います - 自己はSmalltalkでも使用されます。私は本当の質問は

+1

これは答えです。 – manojlds

+0

この回答を前の大部分が同一の質問にまとめました。すぐに回答を返すことができます。 – Shog9

2

selfがキーワード(*)ではありません...「なぜBjarneはC++でthisを使用することを決定しました」である必要がありますね。

selfは、慣例により、あなたはselfhereの詳細情報を取得することができ、現在のオブジェクト

のアドレスを表します。

なぜわからないthis?それは名前のための大会です。あなたが好きなら、あなたのコードにthisを使うことができます。


(*)この回答は移植され、why 'self' instead of 'this' keywordを尋ねる質問からここにマージされました。この最初の行の説明が他の人には役に立ちそうなので、私はここで続けます。

+0

この回答を前の大部分同じ質問にマージしました。あなたはすぐにそれを聞きたいかもしれません。 – Shog9

関連する問題