クラス変数の継承
まずは簡単な例からみていこう。
code:python
class Hoge:
a = 1
class Foo(Hoge):
pass
f1 = Foo()
print(Hoge.a, Foo.a)
# 1 1
親クラスHogeのクラス変数aをFooからも参照している。続けて、親のクラス変数の値を更新してみよう。
code:python
Hoge.a = 2
print(Hoge.a, Foo.a)
# 2 2
この結果から、子クラスFooのクラス変数aは親クラスのクラス変数の参照であることがわかる。
しかし、子クラスのクラス変数の値を更新してみると、
code:python
Foo.a = 3
print(Hoge.a, Foo.a)
# 2 3
のように、子のクラス変数が親への参照ではなくなる。
結論として、
継承した時点では、子クラスのクラス変数は親クラスのクラス変数への参照である。
子クラス内部で親クラスのクラス変数への代入処理を行うと、代入は行われずに子クラス固有のクラス変数が新たに作られる。名称が同じなので新たな変数で覆い隠されることとなる(シャドーイング)。
global宣言を行わないグローバル変数の扱いでも似たような話があった。