Pythonクラスの雛型

Pythonでクラスを作成するとき、コメントの場所、スーパークラスのコンストラクタ呼び出し、デストラクタの名前、withに対応させるメソッド名など、いろいろ忘れてしまう。
雛型を作ろう。

Pythonクラス雛形

class MyClass(object):
    '''私の作るクラス。ここにクラスのコメントを記述する。
       このコメントがクラスの説明として表示される。
       objectを継承しているが、この記述は省略可能。
    '''

    def __init__(self, x, y):
        ''' コンストラクタ。ここにメソッドのコメントを記述する。

            Args:
                x (str): xxxx
                y (str): yyyy
        '''
        self.x = x
        self.y = y
        self.file1 = self.__open('file1.txt', 'a')
        self.file2 = None

    def __del__(self):
        '''デストラクタ。終了処理を書く。
           ただしクラス開放のタイミングはPython任せになる。
        '''
        self.file1.close()

    def __enter__(self):
        '''withブロックが開始した時に呼び出されるメソッド。
           ここでオープン処理を行う。
           selfをreturnする必要がある。
        '''
        self.file2 = self.__open('file2.txt', 'a')
        return self

    def __exit__(self, exc_type, exc_val, exc_th):
        '''withブロックが終了した時に呼び出されるメソッド。
           ここでクローズ処理を行う。
           引数を4つ取る必要がある。
        '''
        self.file2.close()

    def __open(self, filename, open_mode):
        ''' アンダースコア2つのメソッドは、外から呼べなくなる。
            プライベートメソッドを定義したいときはこうする。

            Args:
                filename (str): file nema.
                open_mode (str): file open mode.
            Returns:
                stream: file stream
        '''
        return open(filename, open_mode)

    def write(self, msg):
        ''' 通常の公開メソッド。引数の説明を書くと親切。

            Args:
                msg (str): メッセージ
        '''
        self.file1.write(msg + '\n')
        if self.file2:
            self.file2.write(msg + '\n')

    def __str__(self):
        '''str()したときに呼ばれるメソッド。
           インスタンスを単純にプリントした時に表示されるので、
           デバッグ時に役立つ。
        '''
        return 'X[{}] Y[{}]'.format(self.x, self.y)

    def __repr__(self):
        '''repr()したときや、インタラクティブシェルで書き出した時に
           呼び出されるメソッド。
           eval()でオブジェクトになるように記述する。
           定義しておくとデバッグ時に役立つ。
        '''
        return '''MyClass('{}', '{}')'''.format(self.x, self.y)


class MyClassClass(MyClass):
    '''MyClassを継承したクラス
    '''

    def __init__(self, x, y, z):
        '''コンストラクタ。
        '''
        # スーパークラスのコンストラクタを呼び出す方法
        super(MyClassClass, self).__init__(x, y)
        self.z = z
    
    def __str__(self):
        return 'X[{}] Y[{}] Z[{}]'.format(self.x, self.y, self.z)
    
    def __repr__(self):
        return '''MyClassClass('{}', '{}', '{}')'''.format(
            self.x, self.y, self.z)

まとめ

これで次からクラスを作る度に調べる必要がなくなる。

同じタグの記事
同じカテゴリの記事

Java8で指定回数繰り返し

Java8からStreamAPIが利用できる。
StreamAPIを利用するとC言語の頃から利用されている下記のようなforループは書く必要がない。

for (int i = 0 ; i < 10 ; i++) {
    proc(i);
}

IntStreamを利用する

import java.util.stream.IntStream

IntStream.range(0, 10).forEach(i -> proc(i));

これで同様の処理が行える。
0から9までの10回。見慣れた感じだ。
配列の添え字は基本的に0から使うので、これで全く問題ない。

1〜10の場合は

出力用に1~10が欲しいときもある。従来の書き方であればこうだろうか。

for (int i = 1 ; i <= 10 ; i++) {
    System.out.println(i);
}

これで、1~10が出力される。StreamAPIを使うと

import java.util.stream.IntStream

IntStream.rangeClosed(1, 10).forEach(i -> {
    System.out.println(i);
});

rangeClosedを使うことで「10まで」と言うのがわかりやすく書ける。

まとめ

記述する文字数はStreamAPIを使った方が長くなってしまう気もするけど、やりたい事が伝わりやすいのはStreamAPIのような気がする。
開発標準がJava8以降になったら、順次導入していきたい。
(いまだにJava6が標準のシステムもメンテナンスしている)

同じタグの記事
同じカテゴリの記事