属性をプライベートにして読み取り専用プロパティにする必要があるのはいつですか? [closed] 質問する

属性をプライベートにして読み取り専用プロパティにする必要があるのはいつですか? [closed] 質問する

属性をプライベートにする必要があるかどうか、 を使用する必要があるかどうかがわかりませんproperty

最近読んだところによると、セッターとゲッターは Python 的ではないが、propertyデコレータの使用は問題ないそうです。

しかし、クラスの外部から設定してはいけないが、読み取り可能な属性(読み取り専用属性)がある場合はどうでしょうか。この属性はプライベートにすべきでしょうか。プライベートとは、このようにアンダースコアで囲むことですかself._x?もしそうなら、ゲッターを使用せずに読み取るにはどうすればよいのでしょうか?今わかっている唯一の方法は、次のように書くことです。

@property
def x(self):
    return self._x

そうすれば属性を読み取ることはできますobj.xが、設定することはできないobj.x = 1ので問題ありません。

しかし、設定してはいけないオブジェクトを設定することについて本当に気にする必要があるのでしょうか? そのままにしておくべきかもしれません。しかし、obj._xユーザーにとって読み方が変なのでアンダースコアを使用できません。そのため、 を使用する必要がありますobj.xが、ユーザーはこの属性を設定してはいけないことを知りません。

あなたの意見と実践は何ですか?

ベストアンサー1

ただの私の意見ですが、サイラス・レイ正しい方向に進んでいますが、例を追加したいと思いました。 ;-)

Python は型安全でない言語であるため、コードのユーザーが合理的な (分別のある) 人としてコードを使用すると常に信頼する必要があります。

パーペップ8:

非パブリック メソッドとインスタンス変数には、先頭に 1 つのアンダースコアのみを使用します。

クラスに「読み取り専用」プロパティを持たせるには、デコレーションを利用できますが、新しいスタイルのクラスを利用するには、その際@propertyに継承する必要があります。object

例:

>>> class A(object):
...     def __init__(self, a):
...         self._a = a
...
...     @property
...     def a(self):
...         return self._a
... 
>>> a = A('test')
>>> a.a
'test'
>>> a.a = 'pleh'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute

おすすめ記事