5
1

More than 3 years have passed since last update.

pythonで@propertyを使った時にcan't set attributeが出る

Last updated at Posted at 2020-09-02

どうもpythonでコードを書いてる者です

とかいってまだ初心者なのでエラーでつまることも多々あります。
そのなかでこれまでよくわからずに放置してきたクラスのセッターやゲッターをこの期にちゃんと学び直してみようと思い今回は書いております。ではいきましょーー

*使用した言語等のバージョンは以下の通りです。

python 3.7.4

can't set attributeで引っかかる

クラスで生成したものを取得したい時ありますよね。そんな時どうするでしょうか。

practice01.py
class C(object):
    def __init__(self) -> None:
        self.x = 1


c = C()
r = c.x
print(r)
# 1

簡単に書けばこうです。でもせっかくなら@propertyとか使ってみたいでしょ

practice02.py
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が出ました。
では、解決方法をまず提示しておきたいと思います。

practice03.py
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でいう

getter.py
@property
    def x(self):
        if self._x is None:
            return None
        return self._x

の部分がゲッターと呼ばれるものですね!

なぜゲッター、セッターを使うのか

今回記事にしたような単純なものの場合はゲッターやセッターを用いずに書いた方がわかりやすいと思います。実際に使うのは、クラス内に存在するメソッドを属性のように扱いたい時に用いるのではないでしょうか。

とても参考になる記事がありますので参照させていただきます。

python3 プロパティの必要性が分かりません。

この記事からも分かるように、結局ゲッターやセッターと言うのはわかりやすくしたい時に使う手法・テクニックのひとつではないでしょうか。つまり気分ということです。
うまく使いこなせるようになればより綺麗でわかりやすいコードが書けると言うことでしょう!!僕もうまく使いこなせるようにがんばって勉強していきたいと思います!

コメント欄にてわかりやすいことを書いてくださった方がいますので、そちらもご覧ください!

では!

追記(2021/03/30)

こちらの記事も参考になりましたので、追記しておきます。

【Python】クラスのプロパティ(getter/setter)の書き方【入門第35回】

5
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1