Python の self とかクラスとかインスタンス変数とか
?コンストラクタの引数
Python15分講座 #3 (クラス) - t_nagataの日記
Pythonのコードのコンストラクタでは第一引数に「self」が指定してあります。
これはJavaで言う「this」です。(selfはしかるべきエディタではハイライトされます)
Pythonでは、Javaで言う「this」を明示的に「self」と指定してあげます。
「self.foo = bar」はインスタンス変数fooを宣言と同時に初期化したことになります。
「def printFoo(self):」も同様にインスタンスメソッド。
この辺は順番に考えていくと凄くわかりやすいです.
もう,これだけで Python 勉強すべきって思うくらい
インスタンスに値を追加してみる
class Hoge(object): pass hoge = Hoge() hoge.a = 10 // hoge に a を追加 hoge.b = 'hoge' print hoge.a // 10 と表示される print hoge.b // hoge と表示される
これでhogeに a と b を持たす事が出来るのはわかるよね?
でも,インスタンス生成する時になんども a と b に代入するのもメンドいから関数として切り出してみようか
関数として切り出す
def initialize(obj, a, b): obj.a = a obj.b = b hoge = Hoge() initialize(hoge, 10, 'hoge') //関数呼びだし print hoge.a // 10 と表示される print hoge.b // hoge と表示される
やってる事は変わらないけど,複数 Hoge のインスタンス作る時に便利になったよね.
でも,これは Hoge を初期化する関数なんだから Hoge クラスが持ってた方が良いよね?
じゃぁ,Hoge クラスにこの関数を持たしてみようか
クラスに関数を持たせす
class Hoge(object): def initialize(obj, a, b): obj.a = a obj.b = b hoge = Hoge() Hoge.initialize(hoge, 10, 'hoge') //クラス関数として呼びだし print hoge.a // 10 と表示される print hoge.b // hoge と表示される
これで Hoge を初期化する処理を Hoge クラス自体に持たせる事が出来たね.
さて,ここで思い出して欲しいんだけど,Python ではインスタンスメソッドの呼び出しは第一引数に自分自身を渡すんだ.
つまり上記のコードはこうも書ける.
hoge.initialize(10,'hoge') print hoge.a // 10 と表示される print hoge.b // hoge と表示される
さて,ここまで来たら後は簡単だ.
Python では コンストラクタは __init__ って記載する.
そしてインスタンスメソッドと同じように第一引数に自分自身が渡ってくる.
じゃぁ,上記をコンストラクタに変更してみよう.
コンストラクタとして呼び出す
class Hoge(object): def __init__(obj, a, b): obj.a = a obj.b = b hoge = Hoge(10,'hoge') // 引数付きでコンストラクタ呼び出し print hoge.a // 10 と表示される print hoge.b // hoge と表示される
うん,コンストラクタ出来たね.
最後に習慣に従って第一引数の仮引数名を self にしてみよう
class Hoge(object): def __init__(self, a, b): self.a = a self.b = b hoge = Hoge(10,'hoge') // 引数付きでコンストラクタ呼び出し print hoge.a // 10 と表示される print hoge.b // hoge と表示される
こうやって順番に考えれば Python の self がすごくわかりやすいと思う.
という事で
この仕組みはすごくいいなと思いました。
Python15分講座 #3 (クラス) - t_nagataの日記
Javaのthisは勝手に作られてどこから来たのか普通わからないですが
Pythonではそれもちゃんと自分で受け渡しするものなんですね。
って言うように Java だけやってると気づけなかった所に気づけたりもするので,色々な言語をやるのは良いと思うです!!