ある親クラスがあり、それを継承する子クラスを実装しようとする
親クラスを定義したモジュールが super.py
子クラスは sub.py
というモジュールファイルに分けるとする
2つのファイルは同一ディレクトリ内に含まれている
super.py
class superClass:
def setData(self, value):
self.data = value
def display(self):
print(data)
def setData(self, value):
self.data = value
def display(self):
print(data)
sub.py
class subClass(superClass):
def display(self):
print("this is subClass.display()")
print(data)
def display(self):
print("this is subClass.display()")
print(data)
ここでまず普通にpythonを使ってる人はわかるとおもうが、sub.pyで、subClassを定義する際にsuperClassが定義されていないので
NameError: name 'superClass' is not defined
というエラーが出てしまう。
なぜならsub.pyでは、super.pyの中のsuperClassというクラスが呼び出されていないため、無い物を参照しようとしているからである。
ここでやらなくてはいけないことは、
sub.pyの中で、class subClass(superClass)の前にimportでsuper モジュールを呼び出してあげなくてはいけない
import モジュール名
でそのモジュールの中の変数を取り込むことができる。
↑のsuper.pyは現段階で superClassという名前の変数にクラスオブジェクトがはいる。
これにより、呼び出し元のsub.pyのモジュール内に、superClass変数がとりこまれ、利用可能になる
pythonにおけるモジュール内の変数へのアクセスは
モジュール名.変数名
でアクセスできる。
よってsuperClassという名の変数をsubClass.pyで利用するときは
super.superClass
としなくてはならない
subClass.py 修正
import superClass
class subClass(super.superClass):
def display(self):
print("this is subClass.display()")
print(data)
この場合はsuperClass内に一つのクラス定義しかないが、superClass.pyのなかにいくつも関数や変数を定義していた場合、 import superClassにより、superClass.pyのなかのすべての変数が取り込まれてしまう
これを防ぐためには
from モジュール名 import 変数名
で解決できる。 このとき、モジュールの中から変数名を指定して取り込むので、変数へのアクセスは
モジュール名.変数名
でなく
変数名のみで直接アクセスできる
ということで、これを修正してみると
subClass.py さらに修正
from super import superClass
class subClass(superClass):
def display(self):
print("this is subClass.display()")
print(data)
という流れになる。
pythonのエラー解決をする際に、ネット上で日本語の記事がヒットせず、基本は英語の文章を漁るということが多い。
英語もちゃんと読めなきゃだめっすねということをpythonでのコーディングをしつつ実感します