kakts-log

programming について調べたことを整理していきます

python クラスとimportについて

pythonでのコーディングを勉強し始めた当初、モジュールのimport関連でエラーが出ていろいろつまづいたことがあったので、それを整理するためにまとめてみる。

ある親クラスがあり、それを継承する子クラスを実装しようとする

親クラスを定義したモジュールが super.py
子クラスは sub.py
というモジュールファイルに分けるとする
2つのファイルは同一ディレクトリ内に含まれている

 
super.py
class superClass:
    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)

ここでまず普通に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でのコーディングをしつつ実感します