0
class teste(object):
    def __init__(self,a):
        self.a=a

    def getA(self):
        return self.a



new=teste("lucas")
print new.getA()  #########  LINE 1
print new.a       #########  LINE 2 

なぜクラスで常にこの「get」メソッドが必要なのですか? 「LINE 1」と「LINE 2」の違いは何ですか?それらは同じものを出力します。

4

5 に答える 5

4

あなたはPythonではありません。

getter と setter はしばしば「un pythonic」 (関連: python -c 'import this') と見なされることに注意してください。

ゲッターは単なるスタイルです。ゲッターを使用したい場合もありますが、常に必要というわけではありません。ゲッターとセッターに関する一般的な議論については、ゲッターとセッターを使用する理由を参照してください。

Python との関連性を高めるには、以下を検討してください:
意見の一部別の意見の一部、サンプル コード、またはその他のサンプル コード

于 2013-02-21T21:32:36.173 に答える
3

Python では get メソッドは必要ありません。それはコーディングスタイルの問題です。

于 2013-02-21T21:29:39.300 に答える
1

他の回答では、Python ではゲッターは不要であり、それは単なるスタイルの問題であると既に述べています。

しかし、ここで重要なのは Python スタイルがあり、不必要な getter がそのスタイルに反することです。不必要な getter を使用すると、経験豊富な Python 開発者がコードを読むときに警告が表示されます。(ここで「誰かが Java を使いすぎた」というバリエーションを含む 3 つのコメントを取得するのに何秒かかりましたか?)

PEP 8 スタイル ガイドのDesigning for inheritanceを読むと、次のように書かれています。

単純なパブリック データ属性の場合は、複雑なアクセサー/ミューテーター メソッドを使用せずに、属性名のみを公開することをお勧めします。Python は、単純なデータ属性が機能的な動作を拡張する必要があることに気付いた場合に、将来の拡張への簡単な道筋を提供することに注意してください。その場合、プロパティを使用して、関数の実装を単純なデータ属性アクセス構文の背後に隠します。

PEP 8 は、stdlib のスタイル ガイドとしてのみ意図されていますが、一般的には、慣用的な Python がどのように見えるかを適切に説明していると考えられています (「TOOWTDI」は、少なくとも理論的には、説明的なガイドが暗黙のうちに規範的なガイドであることを意味します)。 PEP 8 ガイドラインに照らして独自のコードをテストできる優れたテスターとフィクサー。


私が取り組んでいる間、William の回答は、言語にとらわれない質問であるgetters と setters を使用する理由にリンクされています。受け入れられた回答は、アクセサが時々良いアイデアである理由のリストです。Python に関連するものはほとんどありません。ほとんどの場合、1 つの単語で答えることができます: @property(または、最後の場合はattrgetter)。残りは:

  • ライフタイムとメモリ管理の制御… Python はメモリを管理しています。
  • デバッグ インターセプト ポイントの提供…解釈された言語により、デバッグ中にウォッチポイントを簡単に配置できます。
  • ライブラリとの相互運用性の向上… Python のmockpickleなどは、属性を操作するように設計されています。
  • 継承者がプロパティの動作のセマンティクスを変更し、getter/setter メソッドをオーバーライドして公開できるようにします。これは、C++ や Java などの仮想関数を除き、静的型付けを使用する言語にのみ関連します。
于 2013-02-21T21:55:40.253 に答える
0

通常、Pythonでは通常の属性アクセスを使用します。後で「getters」と「setters」が必要になった場合は、それらをプロパティに簡単に変換できます。「万が一に備えて」コードを乱雑にする必要はありません

私にとって重要な点の1つは、これを行うときにクラスを使用するコードを変更する必要がないということです

于 2013-02-21T21:52:40.520 に答える
0

「get」メソッドを使用する必要はありません。例の唯一の違いは、使用new.aすると新しい値を割り当てることができることです。

したがって、読み取り専用属性を使用する場合は、get メソッドが適切です。(メソッドが変更可能なオブジェクトを返す場合、そのオブジェクトを変更できるため、技術的には読み取り専用ではないことに注意してください)

于 2013-02-21T21:31:53.710 に答える