Pythonのプロパティ(@property)の使い方!ゲッター・セッターの活用
生徒
「Pythonのクラスで、変数に直接アクセスしちゃダメって聞いたんですが、どうしてですか?」
先生
「直接触れると、思わぬ値が入ってしまうことがあるからです。その対策としてプロパティという仕組みがあります。」
生徒
「プロパティって難しそうです……。初心者でも使えるんですか?」
先生
「考え方はとてもシンプルです。箱のフタを開ける役割だと思って、順番に見ていきましょう。」
1. プロパティとは何か
Pythonのプロパティとは、クラスの中の変数を安全に読み書きするための仕組みです。正式には@propertyデコレータを使って作ります。
プログラムでは、データをそのまま外から自由に変更できる状態は危険です。例えば、年齢にマイナスの数が入ってしまうと、正しい処理ができなくなります。
プロパティは「変数に直接触っているように見せながら、実際にはチェック付きで操作する」ための仕組みです。
2. ゲッターとセッターの考え方
プロパティには、よく「ゲッター」と「セッター」という言葉が出てきます。
ゲッターとは「値を取り出す処理」のことです。セッターとは「値を設定する処理」のことです。難しい言葉ですが、やっていることは単純です。
ゲッターはフタを開けて中を見る役割、セッターはルールを確認してから中に入れる役割だと考えると分かりやすいです。
3. プロパティを使わない場合の問題点
まずは、プロパティを使わない例を見てみましょう。
class User:
def __init__(self, age):
self.age = age
user = User(20)
user.age = -5
print(user.age)
-5
このように、外から自由に値を変更できてしまいます。これでは、データの正しさを守れません。
4. @propertyを使った基本的な書き方
次に、プロパティを使った書き方です。変数の前にアンダースコアを付けるのが一般的です。これは「直接触らないでほしい」という合図です。
class User:
def __init__(self, age):
self._age = age
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if value < 0:
print("年齢は0以上で入力してください。")
else:
self._age = value
user = User(20)
user.age = -5
print(user.age)
年齢は0以上で入力してください。
20
見た目はuser.ageと直接触っているように見えますが、裏ではチェック処理が動いています。
5. なぜ関数ではなくプロパティを使うのか
「それなら、get_ageやset_ageという関数でいいのでは?」と思うかもしれません。
プロパティの良い点は、使う側が「変数のように扱える」ことです。コードが自然で読みやすくなります。
将来、内部の仕組みを変えても、使う側の書き方を変えなくて済むのも大きなメリットです。
6. 読み取り専用プロパティ
セッターを書かなければ、読み取り専用のプロパティになります。外から値を変更されたくない場合に使います。
class Product:
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
product = Product("りんご")
print(product.name)
りんご
この場合、product.nameに新しい値を代入しようとするとエラーになります。
7. 初心者が覚えておきたいポイント
プロパティは「データを守るための仕組み」です。最初は必要性を感じにくいですが、クラスが増えるほど重要になります。
すべての変数に使う必要はありません。「ルールを守ってほしい値」にだけ使えば十分です。
@propertyはPythonのオブジェクト指向プログラミングでとてもよく使われる考え方なので、意味を理解しておくことが大切です。