おはようございます。Shotaです。今日も早速、Pythonに関する記事を書いていきます。
今日は「プロパティ」について説明していきます。
【目次】
プロパティ
クラスを洗いに保管する際に、インスタンス変数を用意します。これは便利ですが、外部からのアクセスが容易だと複雑なプログラムを作成した場合に読みづらくなってしまうなどのデメリットがあります。
プライベート変数にすればいいのですが、そうすると変数にアクセスするためのメソッドを用意して利用することになります。インスタンス変数と違って、メソッドを使ってアクセスするのはコード量が増えますし、またプライベート変数にアクセスする関数を逐一覚えている必要があります。
値を管理でき、インスタンス変数のように自然に値にアクセスできる。このような機能がPythonには用意されています。それがプロパティです。
プロパティは「メソッドでアクセスできるインスタンス変数」です。インスタンス変数の読み書きは、予め用意したメソッドを用意して行われます。実際にプロパティを利用するときは、メソッドを呼び出すのではなく直接プロパティの値を読み書きできるかのように動作します。
プロパティは以下のように定義します。
@property def プロパティ(self): return 'text'
@プロパティ名.setter
def プロパティ名(self, val):
---値を設定するための処理---
プロパティは「@property」というアノテーションを付けたメソッドとして定義されます。例えば、ここで「def fn」というメソッドを用意すればfnという名前のプロパティが定義されます。この「@property」は、プロパティの値を取り出すメソッドを定義するためのものです。returnで返した値が、このプロパティの値として利用されます。
プロパティの値の変更は「@プロパティ名.setter」というアノテーションをつけたメソッドとして定義されます。例えばfnプロパティならば、「@fn.setter」となります。メソッド名は、同じくプロパティの名前になります。引数には、selfの他にプロパティに設定する値を渡すための引数が用意されています。この引数の値を使って、プロパティの値を変更します。
実際に以下のコードを書いて、プロパティを使ってみましょう。
#プロパティの定義と利用 class Sample: def __init__(self, msg): self.message = msg def __str__(self): return f'<Sample: message = "{self.message}">' #プロパティ @property def message(self): return self.__message #プロパティの値の変更のための関数 @message.setter def message(self, value): if value != '': self.__message = value ob = Sample('Python') print(ob.message) ob.message = '' print(ob) ob.message = 'Author' print(ob)
▼実行結果
Python <Sample: message = "Python"> <Sample: message = "Author">
@propertyでは、self._messageをそのままreturnしています。そして@message.setterでは、valueが空の文字列でなければself._messageに値を設定しています。値を空にできないように設定しているのです。
プロパティを使うと、このように値の取得や設定を制御できます。どんな値にも勝手に変更できてしまうようなことはなくなり、こちらで用意した形式ではないかどうかなどをプログラムでチェックしてインスタンス変数よりも安全に値を利用できるようになります。
まとめ
【本日のまとめ】
本ブログでは、こんな感じでPythonにまつわる情報や基本的な知識、Pythonの操作方法やニュースをたくさん紹介していきます。毎週日曜日に、普段とは趣向を変えて有名な自己啓発本・ビジネス書を要約・考察するブログを書いていきます。
この記事がいいと思った人はSNSにシェアしてくれると非常に嬉しいです!
明日は日曜日なので、本の要約・考察をしていきたいと思います。第9回で取り上げる本は『エッセンシャル思考』です。
今日も最後まで読んでくださりありがとうございました!