質問: 今「pythonスタートブック」という本で新しいデータ型を作る クラスについて勉強してます この中で分からないのがselfの仕組みです 現在サイコロ型というデータ型を作ろうと本の中でやっています そのスクリプトがこれです import random class Dice: [tab]face_num=6 [tab]def shoot(self): [tab][tab]return random.randint(1,6) これをdice.pyと保存した後 インタラクティヴシェル(=コマンドプロンプト?)で下記のよう操作を実行しました。 >>>import dice >>>sai=dice.Dice() >>>sai.shoot() 2 この様な勉強をしました。 ここからが本題で この後、本の中ではface_num=6が全く使われてないからこれを活用しようという ことになり、下記の様なスクリプトが出てきます import random class Dice: [tab]face_num=6 [tab]def shoot(self): [tab][tab]return random.randint(1,face_num) この後先ほどと同じようにインタラクティヴシェル(コマンドプロンプト?) >>>reload(dice) >>>sai=dice.Dice() >>>sai.shoot() と入力するように指示されます しかしこれはわざと間違えてきちんと動かない例を教えています エラーの理由は関数(def shoot)の内部では外の変数が見る事が出来ないからで その後正しいスクリプトが下記の様に記載されます import random class Dice: [tab]face_num=6 [tab]def shoot(self): [tab][tab]return random.randint(1,self.face_num) 本の説明では、これで動くのは 自分自身をselfで参照することに決めておけば、sai.shoot()というコードが実行されたとき、Python内部で自動的にsaiという名前が付いたインスタンスをselfという名前にして、shootメソッドに渡してくれます この様に書かれてますが、ここがきちんと理解できなくて 自分なりに考えた結果下記のような言い方で解釈してるのですが合ってますでしょうか? コマンドプロンプトで 変数saiに >>>sai=dice.Dice() のサイコロ型を代入した後 >>>sai.shoot() のメソッドを使う時 saiの中にface_num=6という数字が植えつけられており shoot(self)メソッドの中のselfにsai自身が代入され(sai=self) その後 return random.randint(1,self.face_num) このスクリプトのself.face_numがsai.face_numに置き換えられ sai.face_numというのはDice型の中にあるface_num=6の事を指してるから きちんと動く ちょっと図が無いので文章にすると無駄に長くて分かりづらくなりましたが こんな感じなんですが合ってますでしょうか? 分かりやすい説明(解釈)があればそれを教えていただけないでしょうか
回答: リファレンスが参考になるかと思います。 > > メソッドについて特別なこととして、インスタンスオブジェクトが関数の第1引数として渡されます。 例では、 x.f() という呼び出しは、 MyClass.f(x) と厳密に等価なものです。 > > > つまり、次のように書いても正常に動作します。 ``` >>> sai = Dice() >>> Dice.shoot(sai) 3 ``` これを踏まえると、kakiniさんの洞察がどうやら確からしいと言えそうです。 既にquiquiさんがご指摘のとおり、コードを見やすく表示する機能があります。 編集画面を開き、コードを選択した状態でボタンを押してください。