web-dev-qa-db-ja.com

プロパティを使用してクラス属性(変数とメソッド)の可変性を制限するのはPythonicですか?

いくつかの説明

pythonとプログラミングは初心者です(1年以上使っています)。最近発見したpythonプロパティ、そして、クラスの属性の可変性を制限するためにそれらを使用しています。それは、私またはおそらく私のコードを悪用する可能性がある他の人々の助けになります。また、Pythonでプロパティが機能する方法のため、それらの可変性は簡単に変更できます。

私が目にすることができる唯一の欠点があります:メソッドのドキュメントを書いているとき、それをプロパティ宣言またはメソッドの処方に入れますか?

私の質問

  • これをしてはいけない理由はありますか?
  • そうでない場合、それはPythonicであり、なぜ/なぜそうでないのですか?

本当に簡単な例:

class SomeClass(object):
    @property
    def some_method(self):
        return self._some_method

    def _some_method(self):
         print 'something'

このように、SomeClassのsome_methodメソッドは不変です。


そして、私はこのパターンをクラスのすべての属性に使用しています:

  • 可変/不変
  • 変数/メソッド
  • 「プライベート」/「パブリック」など.
6
Josie Thompson

プロパティを使用してクラス属性(変数とメソッド)の可変性を制限するのはPythonicですか?

クラスまたはインスタンスレベルの属性/プロパティ/変数の場合:はい、絶対に!デコレータ@propertyは、読み取り、書き込み、削除を制御するために特別に組み込まれています。一般的な使用例は次のとおりです。

  • 読み取り専用または書き込み専用の実施
  • 有効な値を確保する
  • 他の州との一貫性を確保する
  • 複数の方法で限られた内部状態を提示する
  • 他のシステムロジックのトリガー
  • 粘り強さ

しかし、本当に私が得ることができる最も信頼できるものは、PEP-8、Pythonスタイルガイドを引用することです。

これを念頭に置いて、Pythonicガイドラインを次に示します。

...

  • 単純なパブリックデータ属性の場合、複雑なアクセサー/ミューテーターメソッドを使用せずに、属性名のみを公開するのが最善です。 Pythonは、単純なデータ属性が機能的な動作を拡張する必要がある場合に、将来の拡張への簡単なパスを提供します。その場合、プロパティを使用して、機能的な実装を単純なデータ属性の背後に隠します。アクセス構文。

メソッドの場合:いいえ、実際にはそうではありません。上記の使用法のほとんどは、通常、メソッドまたは関数には適用されません。これらをクラスまたはオブジェクトレベルで動的に上書きすることは確かに可能ですが、通常は必要ありません。そうすることは確かに問題ありませんが、常に綿密に調査することは珍しいことです。

  • これをしてはいけない理由はありますか?

最初は読みやすさです。パススルーのゲッターとセッターを用意できるように、コードの1行を6つのボイラープレート行にする理由はありません。 Python(ありがたいことに!)は、呼び出し元のコードが属性が生の属性なのかプロパティなのかわからないように設計されています。つまり、ロックされる代わりに、都合の良いときにいつでも変更できます決定に。

2つ目は読みやすさです。プロパティを非表示にするメソッドの場合、追加される値は多くなく、そのスタイルは慣用的ではありません。そもそも何が起こっているのかを理解するには、もっと多くの努力が必要です。また、呼び出していると思われるメソッドが別の名前で呼び出された場合も、後で扱いにくくなります。

3番目は慣習です。特にパブリック/プライベートに関するメモを見ると、パブリックまたはプライベートにマークを付ける方法が必要なようです。ただし、コードサンプルでは、​​既に単一の先行アンダースコアを使用してプライベートコンテンツを示しています。注意として、_private名を参照するだけで取得できます。それはあなた自身の責任で使用すると見なされます。

4つ目は、5つがどれほど重要でないかを示すプレースホルダーです。

5番目はパフォーマンスです。これはほぼ間違いなくパフォーマンスの問題の原因ではありませんが、プロパティを使用すると、技術的にはパフォーマンスが非常にわずかに低下します。それはごくわずかであり、プロファイラーが測定し、これが問題であることが確実でない限り、これを気にする必要はありません。そうではありません。

  • そうでない場合、それはPythonicであり、なぜ/なぜそうでないのですか?

まとめると、Zen of Pythonの「シンプルなものは複雑なものよりも優れている」に固執します。

10
Joel Harmon