1

セッターを提供せずに読み取り専用プロパティを作成しようとしました。しかし、同じクラスでは、そのプロパティ属性にも書き込むことができないようです。

これは、読み取り専用プロパティが機能することになっている方法ですか?そのクラスで変更する必要がありますが、他のクラスで作成したくありません。だから私は次のことができることを好みます:

class MyClass(object)
    def __init__(self):
        self.myAttrib = None

    def getx(self):
        return self.myAttrib

    myAttrib = property(getx, "I'm the read-only property.")

    def MyMethod(self):
        self.myAttrib = myValue

それを達成する方法はありますか?

4

1 に答える 1

7

はい、それはそれが機能することになっている方法です。読み取り専用とは、読み取り専用を意味し、「一部のクラスでは読み取り可能で、他のクラスでは書き込み可能」ではありません。

そのクラスだけで書き込めるようにすることはおそらく可能ですが、なぜこれが必要なのかを考える必要があります。一般に、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属性に名前を付けてその値を直接読み取り、その値を変更してはならないことを文書化する方が簡単です。プロパティのポイントは、属性にアクセスする必要がある人とアクセスしない人に関するプロトコルの強制を提供することではありません。重要なのは、値の取得/設定時にプログラムによる計算または値の操作を可能にすることです(たとえば、プロパティを設定すると、オブジェクト上の他のリンクされた属性も更新されます)。

于 2013-03-05T19:32:48.260 に答える