web-dev-qa-db-ja.com

(Pythonで)get / setパターンを使用しますか?

Get/setを使用することはJava(さまざまな理由により)で一般的に行われているようですが、これを使用するPythonコードはほとんどありません。

Pythonでget/setメソッドを使用または回避するのはなぜですか?

74
Avery Payne

クールなリンク: PythonはJavaではありません :)

Javaでは、パブリックフィールドを使用すると、後でゲッターとセッターを使用することに戻って考えを変える機会がないため、ゲッターとセッターを使用する必要があります。したがって、Javaでは、前もって面倒な作業を省くことができます。 Pythonでは、クラスのクライアントに影響を与えることなく、通常の属性から始めていつでも気分を変えることができるため、これはばかげています。したがって、ゲッターとセッターを作成しないでください。

53
mgv

Pythonでは、パブリックであるため、属性に直接アクセスできます。

class MyClass:

    def __init__(self):
        self.my_attribute = 0  

my_object = MyClass()
my_object.my_attribute = 1 # etc.

属性のアクセスまたは変更で何かをしたい場合は、 properties を使用できます。

class MyClass:

    def __init__(self):
        self._my_attribute = 0

    @property
    def my_attribute(self):
        # Do something if you want
        return self._my_attribute

    @my_attribute.setter
    def my_attribute(self, value):
        # Do something if you want
        self._my_attribute = value

重要なことは、クライアントのコードは同じままです。

106
blokeley

以下は、Guido van Rossumが Masterminds of Programming で述べていることです。

「言語と戦う」とはどういう意味ですか?

ガイド:これは通常、異なる言語でうまく機能する習慣を続けようとしていることを意味します。

[...]人々はすべてをクラスに変え、すべてのアクセスをアクセサメソッドに変えます。
Pythonで実際に行うのは賢明なことではありません。より詳細なコードがあります
デバッグが難しくなり、実行速度が大幅に低下します。 「FORTRANを任意の言語で記述できますか?」という表現を知っています。どの言語でもJavaと書くことができます。

26

いいえ、それは素朴です。一般的に受け入れられている方法は、通常のデータ属性を使用し、より複雑な取得/設定ロジックが必要な属性をプロパティに置き換えることです。

14
Max Shawabkeh

あなたの質問に対する簡単な答えはノーです。必要なときにプロパティを使用すべきです。 Ryan Tamyokoは彼の記事で長い答えを提供しています Getters/Setters/Fuxors

これらすべてを取り除く基本的な価値は、プログラマーにとってコードのすべての行が何らかの価値または意味を持つように努力することです。プログラミング言語は人間向けであり、機械向けではありません。役に立たないコード、読みにくいコード、退屈そうなコードがある場合は、Pythonに削除できる言語機能がある可能性があります。

6
Shane C. Mason

あなたの観察は正しいです。これは通常のスタイルのPythonプログラミングです。属性はすべてパブリックなので、属性を持つオブジェクトの属性と同様に(取得、設定、削除)だけにアクセス(取得、設定、削除)します。クラスまたはインスタンス)。Javaプログラマーが学ぶPythonなぜなら、彼らのPythonコードはJava using Python構文!

私はこれまでのすべてのポスター、特に@MaximilianoのPhillipの有名な記事へのリンクに標準的な設定よりも複雑なものがあるという@Maxの提案に間違いなく同意します(そして取得)クラスおよびインスタンス属性は、プロパティ(または記述子を使用してさらに一般化する)を使用して、属性の取得と設定をカスタマイズします! (これには、プライベート、保護、友人、またはパブリック以外のものを望む場合に必要なポリシーのカスタマイズされたバージョンを追加できることが含まれます。)

興味深いデモとして、Core Python Programming(13章16章) 、メモリではなくディスクに属性を格納するために記述子を使用する例を思いつきました!!はい、それは永続的なストレージの奇妙な形ですが、does可能なことの例を示します!

同様に役立つ別の関連記事を次に示します。 Python:複数のプロパティ、1つのセッター/ゲッター

5
wescpy

私はその答えのためにここに来ていました(残念ながらできませんでした)。しかし、私は回避策 else whereを見つけました。以下のコードは、getの代替となります。
class get_var_lis: def __init__(self): pass def __call__(self): return [2,3,4] def __iter__(self): return iter([2,3,4]) some_other_var = get_var_lis
これは回避策にすぎません。上記の概念を使用することにより、pyでもget/set方法論を簡単に構築できます。

0
yunus