LoginSignup
0
0

More than 3 years have passed since last update.

Pythonのクラスについて意外だったこと

Last updated at Posted at 2020-08-19

驚いた点

以下のようなコードを想定します。

sample.py
class Sample:

    sample_list = []

    def __init__(self, args1):
        self.name = args1

    def add_args(self, args2):
        self.sample_list.append(args2)

このコードを実行するとsample_listがクラス変数となるため、aとbの間でシェアされてしまいます。

>>> a = Sample('a')
>>> b = Sample('b')
>>> a.add_args('hoge')
>>> b.add_args('huga')
>>> a.sample_list
['hoge', 'huga']

このような動作が望ましい場合もあると思いますが、今回はインスタンス毎に独立した変数であってほしいため、以下のような方法でsample_listをインスタンス変数として宣言します。

解決方法

以下のようにインスタンス変数を用いてクラスを設計することで、この問題を防ぐことができます。

sample.py
class Sample:

    def __init__(self, args1):
        self.name = args1
        self.sample_list = []

    def add_args(self, args2):
        self.sample_list.append(args2)

実行結果

>>> a = Sample('a')
>>> b = Sample('b')
>>> a.add_args('hoge')
>>> b.add_args('huga')
>>> a.sample_list
['hoge']
>>> b.sample_list
['huga']

参考

クラス ― Python3.8.5 ドキュメント
とても参考になるコメントありがとうございます!

0
0
3

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
0
0