どうもpythonでコードを書いてる者です
とかいってまだ初心者なのでエラーでつまることも多々あります。
そのなかでこれまでよくわからずに放置してきたクラスのセッターやゲッターをこの期にちゃんと学び直してみようと思い今回は書いております。ではいきましょーー
*使用した言語等のバージョンは以下の通りです。
python 3.7.4
#can't set attributeで引っかかる
クラスで生成したものを取得したい時ありますよね。そんな時どうするでしょうか。
class C(object):
def __init__(self) -> None:
self.x = 1
c = C()
r = c.x
print(r)
# 1
簡単に書けばこうです。でもせっかくなら@propertyとか使ってみたいでしょ
class C(object):
def __init__(self) -> None:
self.x = 1
@property
def x(self):
if self.x is None:
return None
return self.x
c = C()
r = c.x
print(r)
# AttributeError: can't set attribute
はい、AttributeError: can't set attribute
が出ました。
では、解決方法をまず提示しておきたいと思います。
class C(object):
def __init__(self) -> None:
self._x = 1
@property
def x(self):
if self._x is None:
return None
return self._x
c = C()
r = c.x
print(r)
# 1
では、なぜpractice02.py
はうまく動作しないのでしょうか。
それは、変数名と関数名が一致しているからです。つまり、practice03.py
のように変数の方をself._x
としてあげれば、__変数名と関数名が異なる__のでセーフと言うことですね。
そしてpractice03.pyでいう
@property
def x(self):
if self._x is None:
return None
return self._x
の部分がゲッターと呼ばれるものですね!
#なぜゲッター、セッターを使うのか
今回記事にしたような単純なものの場合はゲッターやセッターを用いずに書いた方がわかりやすいと思います。実際に使うのは、__クラス内に存在するメソッドを属性のように扱いたい時__に用いるのではないでしょうか。
とても参考になる記事がありますので参照させていただきます。
この記事からも分かるように、結局ゲッターやセッターと言うのは__わかりやすくしたい時に使う手法・テクニックのひとつ__ではないでしょうか。つまり気分ということです。
うまく使いこなせるようになればより綺麗でわかりやすいコードが書けると言うことでしょう!!僕もうまく使いこなせるようにがんばって勉強していきたいと思います!
コメント欄にてわかりやすいことを書いてくださった方がいますので、そちらもご覧ください!
では!
追記(2021/03/30)
こちらの記事も参考になりましたので、追記しておきます。