Pythonのプロパティ(@property)の使い方!初心者でもわかるゲッター・セッター入門
生徒
「Pythonでクラスを使っていると、変数を直接触っていいのか不安になります…」
先生
「その気持ちは大切ですね。Pythonには、変数を安全に扱うための仕組みがあります。」
生徒
「安全に扱うって、どういうことですか?」
先生
「@propertyを使うと、変数を読むとき・変更するときをコントロールできます。順番に見ていきましょう。」
1. Pythonのプロパティ(@property)とは?
Pythonのプロパティとは、クラスの中にある変数を、直接触らせずに安全に扱うための仕組みです。プログラミングでは、クラスの中にある変数を「属性」と呼びますが、この属性をそのまま変更できると、意図しない値が入ってしまうことがあります。
@propertyを使うと、見た目は普通の変数のように扱いながら、内部では処理を挟むことができます。これにより、初心者でも安心してクラス設計ができるようになります。
2. なぜゲッター・セッターが必要なのか
ゲッターとは「値を取得するための処理」、セッターとは「値を変更するための処理」です。例えば年齢を表す変数に、マイナスの数が入ってしまうとおかしいですよね。こうした不正な値を防ぐために、セッターでチェックを行います。
初心者の方は「直接代入すればいいのでは?」と思いがちですが、プログラムが大きくなるほど、こうした安全装置がとても重要になります。
3. @propertyを使わない場合の例
まずは、プロパティを使わないシンプルなクラスを見てみましょう。この例では、年齢を直接変更できてしまいます。
class User:
def __init__(self, age):
self.age = age
user = User(20)
user.age = -5
print(user.age)
このように、問題のある値でもそのまま代入できてしまいます。これが後々のバグの原因になります。
4. @propertyを使ったゲッターの基本
次に、@propertyを使って値を取得する方法です。これにより、変数を読むときに処理を挟めます。
class User:
def __init__(self, age):
self._age = age
@property
def age(self):
return self._age
user = User(20)
print(user.age)
20
変数名の前にアンダースコアを付けているのは、「直接触らないでほしい」という合図です。
5. セッターを実装して安全に値を変更する
次はセッターです。セッターを使うと、値を変更するときに条件チェックができます。
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 = -3
user.age = 25
print(user.age)
年齢は0以上にしてください
25
6. プロパティは「変数のように使える」のが強み
プロパティの大きな特徴は、使う側から見ると普通の変数と同じように見えることです。メソッドのように呼び出す必要がないため、コードが読みやすくなります。
初心者の方でも、「中では処理が動いているけれど、外からはシンプル」という設計を体験できます。
7. 別の例:名前の文字数をチェックする
最後に、別パターンの例です。名前が空文字にならないようにチェックします。
class Person:
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self, value):
if value == "":
print("名前は空にできません")
else:
self._name = value
person = Person("太郎")
person.name = ""
person.name = "花子"
print(person.name)
名前は空にできません
花子
8. 初心者がつまずきやすいポイント
@propertyは少し書き方が独特なので、最初は難しく感じます。しかし「値を読む」「値を変更する」という二つの場面を分けて考えると理解しやすくなります。
直接変数を触らせないことで、クラスの中身を守る。この考え方が、オブジェクト指向の大切なポイントです。