ゲッターとセッター
ゲッターとセッターメソッドは、主に隠蔽されたクラスのインスタンス変数にアクセスするために使用されマス。
ゲッター(getter)とセッター(setter)は、オブジェクトの属性に対して間接的なアクセスを提供し、属性の値の取得と設定に制御を加えるためのメソッドです。
- ゲッターは、インスタンス変数の値を取得するためのメソッドです。
- セッターは、インスタンス変数の値を設定するためのメソッドです。
ゲッターとセッターを使用すると、以下のようなメリットがあります。
- インスタンス変数への直接的なアクセスを制限できます。
- インスタンス変数の値を変更する前に、バリデーション(検証や確認)などの処理を実行できます。
ゲッター(getter)
- ゲッターは属性の値を取得するメソッドです。通常、属性名の前に”get_”を付けます。
- ゲッターを使用することで、属性値へのアクセスが制御され、属性値を外部から読み取る前に加工したり、検証したりすることができます。
class MyClass:
def __init__(self):
self._my_value = 0
# ゲッターメソッド
def get_value(self):
return self._my_value
セッター(setter)
- セッターは属性の値を設定するメソッドです。通常、属性名の前に”set_”を付けます。
- セッターを使用することで、属性値への代入が制御され、値を設定する前に検証や変換を行うことができます。
class MyClass:
def __init__(self):
self._my_value = 0
# セッターメソッド
def set_value(self, new_value):
if new_value >= 0:
self._my_value = new_value
ゲッターとセッターの使用例
class Person:
def __init__(self, name, age):
self.__name = name # プライベート変数(アンダースコア2つで始まる)
self.__age = age
# ゲッターメソッド(属性にアクセスするためのメソッド)
def get_name(self):
return self.__name
def get_age(self):
return self.__age
# セッターメソッド(属性を設定するためのメソッド)
def set_name(self, name):
self.__name = name
def set_age(self, age):
if age >= 0: # バリデーション
self.__age = age
else:
print("年齢は正の値で設定してください。")
# カプセル化を使用した例
person1 = Person("Joe", 54)
print(person1.get_name()) # ゲッターメソッドを通じて名前を取得
print(person1.get_age()) # ゲッターメソッドを通じて年齢を取得
person1.set_age(-5) # セッターメソッドを通じて年齢を設定(負の値を防ぐ)
print(person1.get_age()) # 年齢は変更されていない
person1.set_name("Real") # セッターメソッドを通じて名前を変更
print(person1.get_name()) # 名前が変更された
# 実行結果
# Joe
# 54
# 年齢は正の値で設定してください。
# 54
# Real
このコードでは、Person
クラス内の属性(__name
と__age
)がプライベートとして定義されており、外部から直接アクセスできません。
代わりに、ゲッターメソッド(get_name
とget_age
)とセッターメソッド(set_name
とset_age
)を介して属性にアクセスと変更を行います。
これにより、属性の値を制御し、データの整合性を保つことができます。
ゲッターとセッターを使うことで、意図しない属性の変更からシステムを守るってことか。
@propertyデコレータ
@property デコレータと @.setter デコレータを使用して、属性に対するゲッターとセッターを定義できます。
これにより、外部からは通常の属性のようにアクセスできます。@propertyデコレータを使用するとゲッターとセッターを簡潔なコードで書くことができます。
@propertyデコレータのゲッター
class MyClass:
def __init__(self, name):
self.__name = name
@property # ゲッターメソッド
def name(self):
return self.__name
my_class = MyClass("Real") # my_classのインスタンス生成
print(my_class.name) # インスタンスから属性ゲット!
# 実行結果
# Real
このコードでは、name
というインスタンス変数を定義しています。name
インスタンス変数は、__name
というプライベート変数によって実装されています。name
インスタンス変数へのアクセスは、@property
デコレータによって定義されたname
ゲッターメソッドを介して行われます。name
ゲッターメソッドは、__name
プライベート変数から値を取得し、それを返します。
@propertyデコレータのセッター
セッターは、インスタンス変数の値を設定するためのメソッドです。
@propertyデコレータのセッターは、@property
デコレータのsetter
属性を使用して定義します。
class MyClass:
def __init__(self, name):
self.__name = name
@property
def name(self):
return self.__name
@name.setter
def name(self, value):
self.__name = value
my_class = MyClass("Joe")
print(my_class.name)
# nameプロパティの値を変更します。
my_class.name = "Real"
print(my_class.name)
# 実行結果
# Joe
# Real
ゲッターとセッターを使用することで、属性にアクセスする際に制約やバリデーションを簡単に実装でき、データの安全性と整合性を確保できマス。