ホームページ  >  記事  >  バックエンド開発  >  Python のデコレーターのゲッターとセッター

Python のデコレーターのゲッターとセッター

PHPz
PHPzオリジナル
2024-08-06 03:46:531040ブラウズ

Decorator Getters and Setters in Python

デコレーターの 1 つのタイプは、プロパティのゲッターとセッターです。これらのデコレータを使用すると、クラス インスタンス内の変数へのアクセスを制御できます。

プロパティのゲッターとセッターは、オブジェクト指向プログラミングにおける属性の制御のために特に設計されています。これらはクラス属性に使用されるという点で関数デコレータとは異なります (関数デコレータに関する私の投稿をここで確認してください)。

関数デコレーターとプロパティのゲッターおよびセッターのデコレーターは両方とも、再利用可能なコードでコードを変更し、「@」構文を使用します。どちらもコードの機能を変更します。

それでは、本題に入りましょう。

プロパティのゲッターとセッターは、さまざまな動作を定義するためにクラス内のメソッドに適用されます。 setter は属性を値に設定し、getter はクラスから属性を取得します。属性は最初に設定されます。

例を見て、それを詳しく見てみましょう:

class Shoe:
    def __init__(self, brand = "Adidas", size = 9):
        self.brand = brand
        self.size = size
        self._condition = "New"

    @property
    def size(self):
        """The size property"""
        return self._size

    @size.setter
    def size(self, size):
        """size must be an integer"""
        if isinstance(size, int):
            self._size = size
        else:
            print("size must be an integer")

    def cobble(self):
        """Repairs the shoe and sets the condition to 'New'."""
        self.condition = "New"
        print("Your shoe is as good as new!")

    @property
    def condition(self):
        """The condition property"""
        return self._condition

    @condition.setter
    def condition(self, condition):
        self._condition = condition

このコードの一部を見てみましょう:

一部の属性 (条件、サイズ) の前のアンダースコアは、それらが非公開であることを開発者に示します。これらは Shoe クラスの各インスタンスに固有です (各靴、小文字)。

状態とサイズが異なる方法でインスタンス化されていることに気づくかもしれません。 self._condition = "New" は、靴クラスの各インスタンス (またはオブジェクト) が "New" の条件でインスタンス化されることを意味します。同じことが size 属性にも行われますが、size は整数である必要があるため (これは検証と呼ばれるプロセスです)、セッター プロパティの検証をトリガーするように self._size = 9 として記述されていません。プロパティの setter メソッドと getter メソッドを介して実行するのではなく、個々の靴オブジェクトの条件を直接設定しています。

cobble メソッドは、各靴オブジェクトの属性を取得/設定するのではなく、単にアクションを実行するだけであるため、デコレータは必要ありません。

コードに最後に変更を加えてみましょう。たとえば、サイズ属性を後で変更できないようにしたい場合はどうすればよいでしょうか?結局のところ、靴のサイズはあまり変わりませんよね?

hasattr() 関数を使用して、各靴オブジェクトのチェックを実行できます。 「_size」の存在によって示される、size のプライベート属性はありますか?その場合は変更できません。実装されたコードは次のとおりです:

 @size.setter
    def size(self, size):
        """size must be an integer and can't be changed once set"""
        if hasattr(self, '_size'):
            raise AttributeError("Can't change size once set")
        if isinstance(size, int):
            self._size = size
        else:
            raise ValueError("size must be an integer")

プロパティのセッターとゲッターは理解するのが少し難しいですが、一度理解すれば、プロのように Python をコーディングできるようになります。

出典:

フラットアイアンスクールの教材

以上がPython のデコレーターのゲッターとセッターの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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