1

重複の可能性:
Python クラスに「get 関数」を使用する利点は何ですか?

Python を読み始めたばかりですが、なぜ Python にセッターとゲッターが必要なのでしょうか? プロパティのように機能するオブジェクト変数が既にあります

検討

class C(object):
    def _init_(self):
        self._x = None

    def get_x(self):
        return self._x

    def set_x(self, value):
        self._x = valu
    x = property(get_x, set_x)

ここでやりたいことをするために Cx = "value" を使用できますか? 物件のメリットは?

ところで、この方法でプロパティ/セッター/ゲッターを作成するのは面倒ですが、これを簡素化する方法はありますか? お気に入り

class C()
   has_attributes("x", "y", "z")
4

3 に答える 3

4

プレーンな属性を使用します:

class C(object):
    def __init__(self):
        self.x = None

後で、必要に応じて x をプロパティに変更できます。「@property」の優れた点は、開発者が getter、setter、および「@property」を使用しないようにすることです。

于 2012-12-25T07:29:54.657 に答える
3

を使用してproperty、必要なものを取得できます。

class C(object):
    def _init_(self):
        self._x = None
    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

次に、通常の属性構文で属性にアクセスできます。

c = C()
c.x = 10    #calls the setter
print(c.x)  #calls the getter

プレーン データ属性の代わりにプロパティを使用する理由はいくつかあります。

  • 属性を文書化できます
  • 読み取り専用にするか、設定されているタイプ/値を確認することで、属性へのアクセスを制御できます
  • 下位互換性を損なうことはありません。何かがプレーンなインスタンス属性であり、それをプロパティに変換することにした場合、その属性で機能するコードは引き続き機能します。get/set の明示的なメソッドを使用した場合、古い API を使用していたすべてのコードを変更する必要があります。
  • 明示的な get/set メソッドを使用するよりも読みやすいです。
于 2012-12-25T06:33:31.993 に答える
2
class C(object):
    def _init_(self):
        self._x = None

    def get_x(self):
        return self._x

    def set_x(self, value):
        self._x = value

    x = property(get_x, set_x)

set と gets で透過的に cx = "foo" を使用できるようになりました。

セットとゲッターの目的は、クラスの内部を公開しないことです。

そんな未来を想像してみてください

self._x 

への変更

sql.save(id(self), value)

と get_x に:

value= sql.sql(id(self))
return convertFromDbFormatToExpectedApiFormat(value)

そのクラスのゲッターとセッターのコードを変更するだけでよく、それと通信するすべてのクラスを変更する必要はありません。

class C(object):
    def _init_(self):
        self.sql = DDBB()

    def get_x(self):
        dbregistry = self.sql.fetch(id(self))
        return convertFromDbFormatToExpectedApiFormat(dbregistry)

    def set_x(self, value):
        self.sql.save(id(self), value)

    x = property(get_x, set_x)
于 2012-12-25T06:33:04.237 に答える