## 2 Object Presentation

Python では、オブジェクトの文字列表現を生成するのに 3つのやり方があります: `repr()` 関数 (あるいはそれと等価な バッククォートを用いた表現) を使う方法、`str()` 関数を使う方法、そして `print` 文を使う方法です。 ほとんどのオブジェクトで `print` 文は `str()` 関数と 同じですが、 必要な場合には特殊なケースとして `FILE*` にも表示できます。 `FILE*` への表示は、効率が問題となっている場合で、一時的な 文字列オブジェクトを作成してファイルに書き込むのでは効率が悪すぎることが プロファイリングからも明らかな場合にのみ使うべきです。

これらのハンドラはどれも必須ではありません。 ほとんどの型ではせいぜい `tp_str` ハンドラと `tp_repr` ハンドラを実装するだけですみます。

        reprfunc tp_repr;
        reprfunc tp_str;
        printfunc tp_print;

`tp_repr` ハンドラは呼び出されたインスタンスの文字列表現を 格納した文字列オブジェクトを返す必要があります。簡単な例は以下のようなものです:

    static PyObject *
    newdatatype_repr(newdatatypeobject * obj)
    {
        return PyString_FromFormat("Repr-ified_newdatatype{{size:\%d}}",
                                   obj->obj_UnderlyingDatatypePtr->size);
    }

`tp_repr` ハンドラが指定されていなければ、インタプリタは その型の `tp_name` とそのオブジェクトの一意な識別値をもちいて 文字列表現を作成します。

`tp_str` ハンドラと `str()` の関係は、上の `tp_repr` ハンドラと `repr()` の関係に相当します。 つまり、これは Python のコードがオブジェクトのインスタンスに対して `str()` を呼び出したときに呼ばれます。この関数の実装は `tp_repr` ハンドラのそれと非常に似ていますが、得られる文字列表現は 人間が読むことを意図されています。`tp_str` が指定されていない場合、 かわりに `tp_repr` ハンドラが使われます。

以下は簡単な例です:

    static PyObject *
    newdatatype_str(newdatatypeobject * obj)
    {
        return PyString_FromFormat("Stringified_newdatatype{{size:\%d}}",
                                   obj->obj_UnderlyingDatatypePtr->size);
    }

print ハンドラは Python がその型のインスタンスを「print する」必要の あるときに毎回呼ばれます。たとえば 'node' が TreeNode 型のインスタンスだと すると、print ハンドラは Python が以下を実行したときに呼ばれます:

    print node

flags 引数には `Py_PRINT_RAW` というフラグがあり、 これはその文字列をクォートやおそらくはエスケープシーケンスの解釈もなしで 表示することを指示します。

この print 関数は `FILE*` オブジェクトを引数としてとります。 たぶん、ここに出力することになるでしょう。

print 関数の例は以下のようになります:

    static int
    newdatatype_print(newdatatypeobject *obj, FILE *fp, int flags)
    {
        if (flags & Py_PRINT_RAW) {
            fprintf(fp, "<{newdatatype object--size: %d}>",
                    obj->obj_UnderlyingDatatypePtr->size);
        }
        else {
            fprintf(fp, "\"<{newdatatype object--size: %d}>\"",
                    obj->obj_UnderlyingDatatypePtr->size);
        }
        return 0;
    }