今「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の事を指してるから
きちんと動く
ちょっと図が無いので文章にすると無駄に長くて分かりづらくなりましたが
こんな感じなんですが合ってますでしょうか?
分かりやすい説明(解釈)があればそれを教えていただけないでしょうか
回答2件
あなたの回答
tips
プレビュー