【コード付】Pythonのproperty(プロパティ)を徹底解説

※本サイトにはプロモーション・広告が含まれています。

(最終更新日:2023年7月)

✔このような方へ向けて書かれた記事となります

「Pythonのpropertyってなんだろう?」
「propertyの使い方を学びたい」
「propertyを使った実例がみたい」

✔当記事を通じてお伝えすること

  • Pythonのpropertyの基本概念
  • propertyの活用方法とその応用例
  • 具体的なpropertyの実例

当記事では、Pythonのpropertyの基本から、さまざまな応用例を実際のコードとともに詳細に解説しています。

最後まで読むことで、Pythonのpropertyを効果的に活用する方法が身につきます。

ぜひ最後までご覧ください。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

propertyとは?

Pythonのpropertyは、クラス内で属性に対するアクセスを制御するためのデコレータのこと。

propertyを使用することで、属性の取得や設定、削除に特定のロジックや処理を関連付けられます。

通常、クラスの属性には直接アクセスできますが、propertyを使用すると、属性にアクセスする際に裏側で特定のメソッドが実行できるのです。

具体的には、以下のようなメソッドが関連付けられます。

  • 属性の取得には、getterメソッド
  • 属性の設定にはsetterメソッド
  • 属性の削除にはdeleterメソッド

以下が簡単な例です。

class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def radius(self):
        return self._radius

    @radius.setter
    def radius(self, value):
        if value > 0:
            self._radius = value
        else:
            raise ValueError("Radius must be positive.")

    @property
    def area(self):
        return 3.14 * self._radius ** 2

# Circleクラスのインスタンスを作成
circle = Circle(5)

# 属性に直接アクセス
print(circle.radius)  # Output: 5

# プロパティを介して属性にアクセス
circle.radius = 7
print(circle.radius)  # Output: 7

# プロパティを介して読み取り専用属性にアクセス
print(circle.area)  # Output: 153.86

Circleクラス内で、radius属性をpropertyでデコレート。

以下のようなことをおこなっています。

  • radiusプロパティを介して_radius属性にアクセス
  • radiusプロパティにはsetterメソッドも定義し、属性の値を設定する際に条件チェックをおこなう
  • areaプロパティを介して計算結果を取得できる

propertyを使用することで、さまざまな処理を追加できます。

  • 属性に対して値の妥当性チェック
  • 計算結果のキャッシュ
  • 読み取り専用属性の設定

これにより、クラスのインターフェースを簡潔かつ安全に設計が可能です。

propertyの基本的な使い方

こちらでは、propertyの基本的な使い方をお伝えします。

  • property()関数を使用する方法
  • propertyデコレータを使用する方法

property()関数を使用する方法

property関数を使うと、クラスのメソッドを属性のようにアクセスするためのpropertyオブジェクトを作成できます。

ここではgetterを定義し、setterを使った値の変更方法とdeleterの使い方を説明します。

class Circle:
    def __init__(self, radius):
        self._radius = radius

    def get_radius(self):
        return self._radius

    def set_radius(self, value):
        if value < 0:
            raise ValueError("半径は0以上でなければなりません")
        self._radius = value

    def del_radius(self):
        print("半径を削除しました")
        del self._radius

    radius = property(get_radius, set_radius, del_radius)

propertyデコレータを使用する方法

@propertyデコレータを使用すると、メソッドを属性のように使うことができます。

これにより、コードがシンプルになります。

class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def radius(self):
        return self._radius

    @radius.setter
    def radius(self, value):
        if value < 0:
            raise ValueError("半径は0以上でなければなりません")
        self._radius = value

    @radius.deleter
    def radius(self):
        print("半径を削除しました")
        del self._radius

property機能の制限とカスタマイズ方法

こちらでは、property機能の制限と、それをカスタマイズする方法についてお伝えします。

  • property()関数を使って制限する方法
  • propertyデコレータで制限する方法

property()関数を使って制限する方法

property関数を使用する場合、setterdeleterを省略することで、属性の変更や削除を制限できます。

これにより、読み取り専用の属性が作成可能です。

propertyデコレータで制限する方法

propertyデコレータを使用しても、同様に属性の変更や削除を制限できます。

setterやdeleterデコレータを定義しないことで、読み取り専用の属性とできるのです。

class Rectangle:
    def __init__(self, width, height):
        self._width = width
        self._height = height

    @property
    def area(self):
        return self._width * self._height

areaは読み取り専用の属性です。

この属性に値を設定しようとするとエラーが発生します。

propertyの活用例

こちらでは、propertyの具体的な活用例をお伝えします。

使い方がわかるだけでなく、どのような場面で使うべきかもきちんと把握しておきましょう。

  • 入力値の検証
  • インスタンスの属性値の自動計算
  • ログや通知の追加

入力値の検証

propertyを使用して、セッターメソッド内で入力値の検証をおこなえます。

不正な値がオブジェクトの状態を破壊することを防げるでしょう。

class Person:
    def __init__(self, age):
        self._age = age

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, value):
        if not isinstance(value, int) or value < 0:
            raise ValueError("年齢は正の整数である必要があります")
        self._age = value

インスタンスの属性値の自動計算

propertyを使用して、ゲッターメソッド内で属性値の自動計算も可能です。

class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def area(self):
        return 3.14 * self._radius ** 2

ログや通知の追加

属性にアクセスされたときや値が変更されたときに、ログを残すなどの通知処理を追加できます。

class Account:
    def __init__(self, balance):
        self._balance = balance

    @property
    def balance(self):
        print("balanceプロパティにアクセスされました")
        return self._balance

    @balance.setter
    def balance(self, value):
        print("balanceプロパティの値が変更されました")
        self._balance = value

まとめ

propertyの理解と活用を通じて、Pythonのスキル向上を目指すことが非常に重要です。

propertyはPythonの強力な機能の一部であり、これを活用することでプログラムの品質を大きく向上させられるでしょう。

これからもさらなる学習や実践を通じて、Pythonプログラミングのスキルを磨いてください。

また、property以外にもPythonには多くの機能がありますので、これを機にさらなる探求をおすすめします。

タイトルとURLをコピーしました