Python

【Python】プロパティの使い方

この記事では、Pythonのプロパティの使い方を解説します。プロパティを実装することで、安全で使いやすいクラスを実装することができます。それでは、プロパティの使い方を見ていきましょう❗️

プロパティとは?

プロパティとは、クラス外部からはインスタンス変数のように使用でき、クラス内部ではメソッドのように実装した属性のことです。

つまり、インスタンス変数にアクセスする際に、メソッドを通したい(何かしらの処理を加えたい)場合に使います。

通常のメソッドを使うことでも実装できますが、いちいちメソッドを呼び出さなければならないので使いづらいですね😭

メソッドを使うと以下のような感じになります。

クラスの定義:

class MyClass:

    def __init__(self, x):
        self._x = x

    # getter
    def get_x(self):
        print('get_x')
        return self._x

    # setter
    def set_x(self, x):
        print('set_x')
        self._x = x

    # deleter
    def del_x(self):
        print('del_x')
        del self._x

インスタンス化・アクセス:

mc = MyClass(1)
print(mc.get_x())
>> get_x
>> 1

mc.set_x(100)
>> set_x

print(mc.get_x())
>> get_x
>> 100

mc.del_x()
>> del_x

print(mc.get_x())
>> get_x
>> AttributeError: 'MyClass' object has no attribute '_x'

プロパティを実装することで、もっとシンプルに扱えるようになります。

プロパティの実装

プロパティを実装するには、「property()を使う方法」「propertyデコレータを使う方法」があります。

property()

propertyクラスのコンストラクタは、以下の引数をとります。

property(fget=None, fset=None, fdel=None, doc=None)

引数のfgetにはgetter、fsetにはsetter、fdelにはdeleter、docにはdocstringを指定します。

docには簡単に説明を書いておけばOKです

試しに、先ほどのコードを書き直すと以下のようになります。

クラスの定義:

class MyClass:

    def __init__(self, x):
        self._x = x

    # getter
    def get_x(self):
        print('get_x')
        return self._x

    # setter
    def set_x(self, x):
        print('set_x')
        self._x = x

    # deleter
    def del_x(self):
        print('del_x')
        del self._x

    x = property(get_x, set_x, del_x, 'x property.')

インスタンス化・アクセス:

mc = MyClass(1)
print(mc.x)
>> get_x
>> 1

mc.x = 100
>> set_x

print(mc.x)
>> get_x
>> 100

del mc.x
>> del_x

print(mc.x)
>> get_x
>> AttributeError: 'MyClass' object has no attribute '_x'

「mc.x」でgetter、「mc.x = 100」でsetter、「del mc.x」でdeleterが呼び出されています。

propertyクラスのインスタンス名がプロパティ名となります。以下のようにインスタンス名をyにしたら「mc.y」でアクセスします。

class MyClass:

    # 省略...

    # インスタンス名をyに変更
    y = property(get_x, set_x, del_x, 'x property.')


mc = MyClass(1)
print(mc.y)
>> get_x
>> 1​

propertyデコレータ

getter、setter、deleterとして扱いたいメソッドに、propertyデコレータを付与することでプロパティを実装できます。

先ほどのコードを書き直すと以下のようになります。

class MyClass:

    def __init__(self, x):
        self._x = x

    # getter
    @property
    def x(self):
        '''x property'''
        print('get_x')
        return self._x

    # setter
    @x.setter
    def x(self, x):
        print('set_x')
        self._x = x

    # deleter
    @x.deleter
    def x(self):
        print('del_x')
        del self._x
  • @propertyデコレータは、付与されたメソッドの名前(ここでは「x」)をそのまま使って、読み出し専用属性のgetterとする
  • setterには「@getter名.setter」、deleterには「@getter名.deleter」を付与します
  • setterとdeleterのメソッド名は、getterと同じに名前にする

機能を制限する

それぞれプロパティを省略することで、機能を制限することができます。

property()

property()の引数を省略することで、機能を制限できます。

クラスの定義:

class MyClass:

    def __init__(self, x):
        self._x = x

    # getter
    def get_x(self):
        print('get_x')
        return self._x

    x = property(get_x)

インスタンス化・アクセス:

mc = MyClass(1)
print(mc.x)
>> get_x
>> 1

mc.x = 100
>> AttributeError: can't set attribute

setterは実装していないので、値をセットしようとするとエラーが発生しました。

propertyデコレータ

特定のデコレータを付与しなければ機能を制限できます。(getterは省略不可)

class MyClass:

    def __init__(self, x):
        self._x = x

    # getter
    @property
    def x(self):
        print('get_x')
        return self._x

まとめ

この記事ではPythonのプロパティの使い方を解説しました。

プロパティを使うことで扱いやすいクラスを実装することができました。インスタンス変数にアクセスする際になにか処理がしたいならプロパティを使いましょう❗️

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

最短3か月でエンジニア転職『DMM WEBCAMP COMMIT』