ロボ君
property() 関数はPythonで属性を作成するために使用される組み込み関数デス。
この関数は、属性のゲッター、セッター、デリータ(deleter)を指定し、属性にアクセスする方法をカスタマイズできます。
Pythonのゲッターとセッター | 関西AIラボ
ゲッターとセッター ゲッターとセッターメソッドは、主に隠蔽されたクラスのインスタンス変数にアクセスするために使用されマス。 ゲッター(getter)とセッター(setter)…
目次
property() 関数
property(fget, fset, fdel, doc)
fget
: ゲッター(getter)メソッドを指定します。属性の値を取得するためのメソッドです。fset
: セッター(setter)メソッドを指定します。属性の値を設定するためのメソッドです。fdel
: デリータ(deleter)メソッドを指定します。属性を削除するためのメソッドです。doc
: 属性の説明文を指定します。
例:
class MyClass:
def __init__(self):
self._value = 0
def get_value(self):
print("Getting value")
return self._value
def set_value(self, new_value):
print("Setting value")
self._value = new_value
def del_value(self):
print("Deleting value")
del self._value
# property() を使用して属性 value を定義
value = property(get_value, set_value, del_value, "これは 'value' の属性です。")
obj = MyClass()
# ゲッターを呼び出して属性を取得
print(obj.value) # 出力: Getting value, 0
# セッターを呼び出して属性を設定
obj.value = 54 # 出力: Setting value
print(obj.value)
# デリータを呼び出して属性を削除
del obj.value # 出力: Deleting value
# 実行結果
# Getting value
# 0
# Setting value
# Getting value
# 54
# Deleting value
property()
関数を使用することで、属性のアクセス制御やバリデーション(妥当性の検証)に役立ちます。
属性データを守る関所みたい。
@propertyデコレータ
@property
デコレータは、property()
関数をラップしたものです。
そのため、@property
デコレータとproperty()
関数は、基本的に同じ機能を提供しますが、@property
デコレータは、コードをより簡潔に記述できます。
1.@propertyデコレータを使用しないコード
class MyClass:
def __init__(self):
self.__name = ""
def get_name(self):
return self.__name
def set_name(self, value):
self.__name = value
my_class = MyClass()
my_class.name = "Real"
print(my_class.name)
# 実行結果
# Real
2.@propertyデコレータを使用したコード
class MyClass:
def __init__(self, name):
self.__name = name
@property
def name(self):
return self.__name
my_class = MyClass("Real")
print(my_class.name)
# 実行結果
# Real
スッキリ!
ゲッターとセッターを設定すると、インスタンス変数へのアクセスを制限するためにも使用できます。
たとえば、以下のようにproperty()
関数のsetter
メソッドをpass
に設定すると、name
プロパティの値を変更できなくなります。
class MyClass:
def __init__(self):
self.__name = "Real"
@property
def name(self):
return self.__name
@name.setter
def name(self, value):
pass
my_class = MyClass()
my_class.name = "Joe" # nameプロパティの値は変更されません
print(my_class.name)
# 実行結果
# Real