Class Properties

C++ では public データメンバを持つクラスは通常嫌われる。 カプセル化の長所を取り入れ良く設計されたクラスはそのデータメンバを隠蔽する。 クラスデータにアクセスする唯一の方法は、アクセス(取得または設定)関数を通すことである。 この例題のアクセス関数はクラスのプロパティを開示する。

    struct Num
    {
        Num();
        float get() const;
        void set(float value);
        ...
    };

Python の attribute アクセスはすばらしいけれど、 attribute は関数呼び出しと若干異なる書式が使えるので、 ユーザに attribute ハンドルを直接触れさせ、カプセル化を壊す必要性はない。 Numクラスは Boost.Python を使用する。

    class_<Num>("Num")
        .add_property("rovalue", &Var::get)
        .add_property("value", &Var::get, &Var::set);

最後に Python では

    >>> x = Num()
    >>> x.value = 3.14
    >>> x.value, x.rovalue
    (3.14, 3.14)
    >>> x.rovalue = 2.17 #error!

クラスのプロパティrovalueは読み込み専用で開示されることに注意しなさい。 rovalueを設定するメンバー関数は渡されていないのだから。

    .add_property("rovalue", &Var::get)