Python の self とかクラスとかインスタンス変数とか

?コンストラクタの引数
Pythonのコードのコンストラクタでは第一引数に「self」が指定してあります。
これはJavaで言う「this」です。(selfはしかるべきエディタではハイライトされます)
Pythonでは、Javaで言う「this」を明示的に「self」と指定してあげます。
「self.foo = bar」はインスタンス変数fooを宣言と同時に初期化したことになります。
「def printFoo(self):」も同様にインスタンスメソッド

Python15分講座 #3 (クラス) - t_nagataの日記


この辺は順番に考えていくと凄くわかりやすいです.
もう,これだけで 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 がすごくわかりやすいと思う.
という事で

この仕組みはすごくいいなと思いました。
Javaのthisは勝手に作られてどこから来たのか普通わからないですが
Pythonではそれもちゃんと自分で受け渡しするものなんですね。

Python15分講座 #3 (クラス) - t_nagataの日記

って言うように Java だけやってると気づけなかった所に気づけたりもするので,色々な言語をやるのは良いと思うです!!