はい、それはそれが機能することになっている方法です。読み取り専用とは、読み取り専用を意味し、「一部のクラスでは読み取り可能で、他のクラスでは書き込み可能」ではありません。
そのクラスだけで書き込めるようにすることはおそらく可能ですが、なぜこれが必要なのかを考える必要があります。一般に、Pythonはこの種の設計を対象としていません。属性がプライベートであることを文書化し、おそらくアンダースコアで始まる名前を付ける必要があります(2つではなく1つのアンダースコア)。これにより、他の誰かがそれを台無しにするコードを書いた場合、彼らは自分自身であり、それを行って何かがうまくいかない場合、それは彼ら自身のせいであることが明らかになります。クラスプライベートアクセスを強制することには、実際のメリットはほとんどありません。
ただし、property
正しく使用していないため、コードにエラーが発生することに注意してください。アクセスしている基になる属性と同じ名前をプロパティに付けています。プロパティが呼び出された場合、そのゲッター/セッターは別の名前myAttrib
の属性を取得/設定する必要があります。プロパティの名前はプロパティ自体の名前であり、取得/設定する値を格納する非表示の属性ではありません。だからもっと好き:
def __init__(self):
self._myAttrib = "I'm the read-only property."
def getx(self):
return self._myAttrib
myAttrib = property(getx)
NowmyAttrib
は、基になる属性への読み取りアクセスを提供するプロパティです_myAttrib
。これが、Pythonでプロパティが機能する方法です。"I'm the read-only property."
に値を渡さずproperty
、基になる属性に直接設定することにも注意してください。
必要に応じて、このようなプロパティを実行して_myAttrib
から、クラスのコードに直接設定することができます。これはあなたが望むように見えるものになります:それはあなたに値を設定させますが、プロパティを使用する他のコード(そして「秘密」で_myAttrib
はない)はそれを設定することができません。
ただし、これも再考する必要があります。このような些細なゲッターを定義することに意味はありません。_myAttrib
属性に名前を付けてその値を直接読み取り、その値を変更してはならないことを文書化する方が簡単です。プロパティのポイントは、属性にアクセスする必要がある人とアクセスしない人に関するプロトコルの強制を提供することではありません。重要なのは、値の取得/設定時にプログラムによる計算または値の操作を可能にすることです(たとえば、プロパティを設定すると、オブジェクト上の他のリンクされた属性も更新されます)。