86

get / setを使用することは(さまざまな理由で)Javaで一般的な方法のようですが、これを使用するPythonコードはほとんど見当たりません。

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

4

8 に答える 8

116

Python では、公開されているため、属性に直接アクセスできます。

class MyClass:

    def __init__(self):
        self.my_attribute = 0  

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

属性のアクセスまたはミューテーションで何かをしたい場合は、プロパティを使用できます。

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

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

于 2010-04-05T18:16:52.493 に答える
60

Cool link: Python is not Java :)

In Java, you have to use getters and setters because using public fields gives you no opportunity to go back and change your mind later to using getters and setters. So in Java, you might as well get the chore out of the way up front. In Python, this is silly, because you can start with a normal attribute and change your mind at any time, without affecting any clients of the class. So, don't write getters and setters.

于 2010-04-05T17:31:13.270 に答える
31

Guido van Rossum がMastermind of Programmingでそれについて述べていることは次のとおりです。

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

Guido:通常は、別の言語でうまくいった習慣を続けようとしているということです。

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

于 2010-04-05T17:54:29.237 に答える
15

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

于 2010-04-05T17:31:27.310 に答える
7

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

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

于 2010-04-05T18:41:18.023 に答える
5

あなたの観察は正しいです。これはPythonプログラミングの通常のスタイルではありません。属性はすべてパブリックであるため、属性を持つオブジェクト(クラスやインスタンスだけでなく)の属性を使用する場合と同じように、属性にアクセス(取得、設定、削除)するだけです。彼らのPythonコードはPython構文を使用したJavaのように見えるので、JavaプログラマーがいつPythonを学ぶかは簡単にわかります。

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

興味深いデモとして、コアPythonプログラミング(第13章、セクション13.16)で、記述子を使用して属性をメモリではなくディスクに格納する例を思いつきました。はい、これは奇妙な形式の永続ストレージですが、可能なことの例を示しています。

同様に役立つと思われる別の関連する投稿があります: Python:複数のプロパティ、1つのセッター/ゲッター

于 2010-04-05T17:57:24.087 に答える
-11

私たちの先生は、アクセサ関数をいつ使うべきかを説明するクラスの一例を示しました。

class Woman(Human):
    def getAge(self):
        if self.age > 30:
            return super().getAge() - 10
        else:
            return super().getAge()
于 2015-05-05T07:09:22.053 に答える