「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Python のデコレーターのゲッターとセッター

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

2024 年 8 月 27 日に公開
ブラウズ:681

Decorator Getters and Setters in Python

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

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

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

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

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

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

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 をコーディングできるようになります。

出典:

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

リリースステートメント この記事は次の場所に転載されています: https://dev.to/tessmueske/decorator-getters-and-setters-in-python-6cd?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3