web-dev-qa-db-ja.com

Pythonクラス変数または@property

データを格納するためにpythonクラスを作成すると、別のクラスがそのクラスのインスタンスを作成してさまざまな変数を出力します。一部のクラス変数は、複数行のコードを必要とする多くのフォーマットを必要とします。 「最終状態」にします。

この構造でクラスの外部から変数にアクセスするのは悪い習慣ですか?

class Data():
    def __init__(self):
        self.data = "data"

または、@ propertyメソッドを使用して変数にアクセスすることをお勧めしますか?

class Data:
    @property
    def data(self):
        return "data"
9
APorter1031

次の場合は注意してください。

class Data:
    @property
    def data(self):
        return "data"

d = Data()
d.data = "try to modify data"

エラーが発生します:

AttributeError:属性を設定できません

そして、私があなたの質問で見るように、あなたは最終状態までデータを変換できるようにしたいので、他のオプションに行きます

class Data2():
    def __init__(self):
        self.data = "data"

d2 = Data2()
d2.data = "now I can be modified"

または前を変更します:

class Data:
  def __init__(self):
    self._data = "data"

  @property
  def data(self):
      return self._data

  @data.setter
  def data(self, value):
    self._data = value

d = Data()
d.data = "now I can be modified"

一般的な方法

Pythonの通常の方法は、属性を直接公開することです。取得または設定時に追加のアクションが必要な場合は、後でプロパティを追加できます。

標準ライブラリのほとんどのモジュールは、この方法に従います。パブリック変数(アンダースコアのプレフィックスが付いていない)は通常、特定の理由(属性を読み取り専用にするなど)がない限り、property()を使用しません。 )。

理論的根拠

通常の属性アクセス(プロパティなし)は、実装が簡単で、理解が簡単で、非常に高速に実行されます。

後でproperty()を使用できる可能性があるということは、 防御プログラミング を練習する必要がないことを意味します。コードを肥大化させてアクセスを遅くするゲッターとセッターを時期尚早に実装する必要を回避できます。

5

基本的に、プロパティの多くの複雑さを隠して、属性のように見せることができます。これにより、コードの可読性が向上します。

また、プロパティと属性の違いを理解する必要があります。参照してください a Python "property"と "attribute"の違いは何ですか?

1
Manoj Bisht