Pythonクラス使い方 パート2

python

privateメンバー変数

pythonではprivate変数を表すのに変数名の前に_(アンダースコア)を付けます。ただ、_(アンダースコア)一つでは知っている作業者であればprivate変数として扱ってくれると思いますが、値を操作出来てしまいます。そのため、外部から操作されなくするには_(アンダースコア)を二つ付ける必要があります。

※rivate変数とは、外部から直接操作して欲しくない変数に使われるものです。例えば、変数の値域を設定したい際に直接触れると値域外の値も設定できてしまいます。そのため、クラス内の関数でしか値を更新できないようにし、その関数に値域確認を入れるといった方法とったりします。

_(アンダースコア)を一つつけた場合

class Test(object):
    def __init__(self, status):
        self._status = status

test = Test(False)
print(test._status)
==================以降出力
False

直接アクセスでき値を参照することができます。

_(アンダースコア)を二つ付けた場合

class Test(object):
    def __init__(self, status):
        self.__status = status

test = Test(False)
print(test.__status)
==================以降出力
Traceback (most recent call last):
  File "**.py", line 6, in <module>
    print(test.__status)
AttributeError: 'Test' object has no attribute '__status'

先ほどと異なり値が参照できなくなります。意向で参照する方法を書いていきます。

getter(ゲッター)、 setter(セッター)

次にgetter(ゲッター)やsetter(セッター)についてです。先程も書きましたがprivate変数は外部から直接編集できません。ただし、値を参照したり、編集したり、する方法を基本的には用意していて、それぞれgetter(ゲッター)やsetter(セッター)と言います。

・getter(ゲッター)

@propertyのデコレーターをつけて変数名の関数を作ります。そして、@status.getterのデコレーターをつけて変数名の関数を作り、private変数を返します。これで、private変数を参照するゲッターになります。

class Test(object):
    def __init__(self, status):
        self.__status = status
    @property
    def status(self):
        pass
    @status.getter
    def status(self):
        return self.__status

test = Test(False)
print(test.status)
==================以降出力
False

ただ、一般的のように@status.getterは無くして@propertyに統一した書き方もできるみたいです。個人的にはコード量も減って以下の方がいいのではと思います。

class Test(object):
    def __init__(self, status):
        self.__status = status
    @property
    def status(self):
        return self.__status

test = Test(False)
print(test.status)
==================以降出力
False

・setter(セッター)

値を参照するgetter(ゲッター)をやりましたが、今度は値を設定するsetter(セッター)をやります。やり方は@status.setterをつけて値を設定する関数を定義します。

class Test(object):
    def __init__(self, status):
        self.__status = status
    @property
    def status(self):
        return self.__status
    
    @status.setter
    def status(self, status):
        self.__status = status

test = Test(False)
print(test.status)
test.status = True
print(test.status)
==================以降出力
False
True

値が更新できていることが分かると思います。

コメント

タイトルとURLをコピーしました