![]() |
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)
![]() |
![]() |
![]() |
Copyright © 2002 David Abrahams
Copyright © 2002 Joel de Guzman
Permission to copy, use, modify, sell and distribute this document
is granted provided this copyright notice appears in all copies. This document
is provided "as is" without express or implied warranty, and with
no claim as to its suitability for any purpose.