LoginSignup
1
1

More than 3 years have passed since last update.

クラス変数

Last updated at Posted at 2020-02-08
1
class Person(object):
    kind = 'human'

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

    def who_are_you(self):
        print(self.name, self.kind)

p1 = Person('A')
p2 = Person('B')

p1.who_are_you()
p2.who_are_you()
1の実行結果
A human
B human

クラス変数(この場合はkind)は、
つくった全てのオブジェクトで共用される。

2
class T(object):
    words = []

    def add_word(self, word):
        self.words.append(word)

c = T()
c.add_word('apple')
c.add_word('banana')
print(c.words)

d = T()
d.add_word('orange')
d.add_word('cake')
print(d.words)
2の実行結果
['apple', 'banana']
['apple', 'banana', 'orange', 'cake']

cというオブジェクトとdというオブジェクト2つのオブジェクトをつくったが、
wordsがクラス変数なので、
cとdで共用されてしまっている。

これがバグにつながる事がある。

これを防ぐためには、
都度__init__で初期化(インスタンス変数に代入)する。

3
class T(object):
    def __init__(self):
        self.words = []

    def add_word(self, word):
        self.words.append(word)

c = T()
c.add_word('apple')
c.add_word('banana')
print(c.words)

d = T()
d.add_word('orange')
d.add_word('cake')
print(d.words)
3の実行結果
['apple', 'banana']
['orange', 'cake']
1
1
0

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