Pythonのproperty() 関数

Pythonのproperty() 関数
ロボ君

property() 関数はPythonで属性を作成するために使用される組み込み関数デス。

この関数は、属性のゲッター、セッター、デリータ(deleter)を指定し、属性にアクセスする方法をカスタマイズできます。

目次

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
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次