ホームページ >バックエンド開発 >Python チュートリアル >Python の @property デコレーターはプロパティを作成するためにどのように機能しますか?

Python の @property デコレーターはプロパティを作成するためにどのように機能しますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-19 01:12:11568ブラウズ

How Does Python's @property Decorator Work to Create Properties?

Python の @property デコレーターについて理解する

Python では、@property デコレーターを使用して、通常のインスタンス属性のように動作するプロパティを作成できます。ただし、引数を取る組み込みのプロパティ関数とは異なり、@property デコレータは明示的に引数を受け取りません。

仕組み

@property の仕組みを理解するにはデコレータが機能する場合は、property() 関数が記述子オブジェクトを返すことを最初に理解することが重要です。これはインスタンスとそのプロパティの間に介在し、追加のロジックを適用できるようにします。

記述子オブジェクト

プロパティによって返される記述子オブジェクト( ) 関数には 3 つの組み込み関数がありますメソッド:

  • getter: プロパティ値を取得する場合
  • setter: プロパティ値を設定する場合
  • deleter: を削除するにはproperty

デコレータを使用したプロパティの作成

@property デコレータが関数に適用されると、記述子オブジェクトが返され、それがプロパティ名に割り当てられます。 。このオブジェクトは、元の関数のゲッター関数を保持し、プロパティのセッター メソッドとデリーター メソッドに委任する 2 つの追加関数を含みます。

例:

class C:
    def __init__(self):
        self._x = None

    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x

上記のコードは、明示的なプロパティ オブジェクトを使用せずに self._x の値を取得できる "x" という名前のプロパティ。 getter 関数はデコレータによって自動的に作成されます。

Setter および Deleter デコレータ

setter メソッドと deleter メソッドを追加するには、@property に .setter と .deleter を追加するだけです。記述子オブジェクト、意図した関数を渡す:

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

@x.deleter
def x(self):
    del self._x

これらを使用することによりメソッドを使用すると、プロパティ値を設定および削除するためのカスタム動作を実装できます。

実装の詳細

@property の @decorator 構文は糖衣構文です。バックグラウンドで次のコードが実行されます:

def x(self): return self._x
x = property(x)

記述子の例

プロパティ記述子の純粋な Python 実装がどのように機能するかを示す例を次に示します。

class Property:
    def __init__(self, fget=None, fset=None, fdel=None, doc=None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel
        self.__doc__ = doc

    def __get__(self, obj, objtype=None):
        if obj is None:
            return self
        if self.fget is None:
            raise AttributeError("unreadable attribute")
        return self.fget(obj)

このクラスを使用すると、ゲッター、セッター、デリーターを使用してプロパティを手動で作成できます関数。

以上がPython の @property デコレーターはプロパティを作成するためにどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。