Python15分講座 #3 (クラス)


講師はid:Yoshioriさんです。


クラスの定義

Javaとコードを比較して書くのが(Javaプログラマには)わかりやすいと思うので
自分自身の確認のためにもJavaと比較しながら書いていこうと思います。


※まだPythonでのアクセス修飾子について勉強していないので
Javaのコード中のアクセス修飾子はスルーしてください。


# 一番簡単なクラス定義
class Hoge:
    pass


中身のない単純なクラスです。
Pythonではインデントがない=ブロックがないことになるので
何も書かないとSyntax Errorになります。
passはそれを防ぐために書く特に意味のない語です。



次に、少し複雑なクラスをJavaと比較しながら定義してみます。

// Javaのコード
public class Hoge{
    // インスタンス変数
    private String foo;

    // コンストラクタ
    public Hoge(String bar){
        this.foo = bar;
    }

    // インスタンスメソッド
    public void printFoo(){
        System.out.print(this.foo);
    }
}
# Pythonのコード
class Hoge(object):
    # コンストラクタ()
    def __init__(self, bar):
        self.foo = bar

    # インスタンスメソッド
    def printFoo(self):
        print(self.foo)

全く同じ機能を持ったコードを並べて書きました。
上から違う点を見ていきます。

①クラスの継承
class Hoge(object):

はobjectクラスを継承したHogeクラスを宣言したことになります。
(objectクラスの先頭の文字は小文字でよいそうです。)


②コンストラクタ(初期化メソッド)
def __init__(self, bar):

__init__がJavaで言うコンストラクタの名前です。
クラスが違っても共通の名前です。
initがアンダーバー2つに囲まれてることに注意です。


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



printFoo()を呼び出すときは

# インスタンスの生成
hogeInstance = Hoge('hogehoge')

# インスタンスメソッドを呼び出す
# selfを指定しないことに注意
# インスタンスメソッドを呼び出す時は、引数selfは自動的に代入される
hogeInstance.printText()

[実行結果]

hogehoge

[7/16訂正]
訂正前のコードではコンストラクタの引数にselfを渡していましたが誤りなので訂正しました。
id:sugyanさん、ご指摘ありがとうございます。
ちなみにこのコードでコンストラクタの引数にselfを渡すとName Errorになりました。


実は、selfの代わりに別の名前でもかまいません。
ですが、あとあとクラス変数も使うようになったときに
それがインスタンスのものなのか、クラスのものなのかわかりにくくなります。
なので、selfを使うようにします。


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


クラス変数などのことも教えてもらったのですが、いろいろ確かめたいことがあって
まだ自分でいろいろ実験できてないので続きはまたにします><


新人は早く帰る決まりがあるのです。