Python チュートリアルの "残りのはしばし"
流れで 9. クラス — Python 2.7ja1 documentation を書くことにした *1
ある特定の抽象データ型を要求する Python コードの断片に、そのデータ型のメソッドをエミュレーションするクラスを代わりに渡すことができます。例えば、ファイルオブジェクトから何らかのデータを構築する関数がある場合、 read() と readline() を持つクラスを定義して、ファイルではなく文字列バッファからデータを取得するようにしておき、引数として渡すことができます。
http://www.python.jp/doc/release/tutorial/classes.html#tut-odds
書いてみた
ファイルオブジェクトだとこんな感じだろうか。
今回はファイルの内容を出力する cat 関数をターゲットにしてみた。
#! /usr/bin/env python # coding: utf-8 def cat(f): """ ファイルの内容を出力する関数 """ for line in f.readlines(): print line.strip() class FakeFile(object): """ 偽装ファイルクラス """ def __init__(self, list): self.__list = list """ とりあえず readlines メソッドだけ実装 ダックタイピングでは期待されるメソッド全てを 実装する必要があるが手抜き。 """ def readlines(self): return self.__list """ ファイルをクローズする 空実装 """ def close(self): return # ファイルの内容を出力 print "---- file object" f = open("student.txt") cat(f) f.close() # ファイルの内容を出力 (偽装ファイルクラスを使う) print "\n---- faked file object" f = FakeFile(['Taro', 'Hanako', 'Pikachu', 'Prince']) cat(f) f.close()
スクリプトと同じディレクトリに下記のようなファイルを置いておく (student.txt)
Joe Bob Alice
実行結果
---- file object Joe Bob Alice ---- faked file object Taro Hanako Pikachu Prince
使いどころ
パッと思いつくところでは、ファイルからオブジェクトを構築するようなファクトリメソッドのテストとか。そっち系。
そもそも 9. クラス — Python 2.7ja1 documentation の理解として正しいのか。
ツッコミお待ちしております。
*1:ダックタイピングという理解で合っているだろうか?