読者です 読者をやめる 読者になる 読者になる

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:ダックタイピングという理解で合っているだろうか?