目次
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
値が更新できていることが分かると思います。
コメント