ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【python】クラスとファイル分け

 今まで色々とpythonを使ってソースコードを書いてきましたが、処理を別ファイルに分けたりクラスに分けたりということを特に意識していませんでした。

 なので今回はpythonでの「クラスとファイル分け」についての備忘録です。

 では始めます。


0:テスト用コード
 とりあえず今回は以下の適当なコードを使ってクラス分けとファイル分けを行なっていきます。

・main.py

#
# テストコード
#
def main():
	print("---start---")

	while True:
		addend1 = input("input the addend1 : ")
		if (addend1 == "end"):
			break

		addend2 = input("input the addend2 : ")
		result = mySum(addend1, addend2)

		showSum(addend1, addend2, result)

	print("---end---")

def mySum(add1, add2):
	return int(add1) + int(add2)

def showSum(add1, add2, result):
	print(str(add1) + " + " + str(add2) + " = " + str(result))

if __name__ == '__main__':
    main()

1:クラス分け
 pythonでのクラスの書き方は以下の通りです。

#
# クラスの書き方
#
class ClassName():
	def __init__(self):
		# コンストラクタの何かしらの処理

	def func1(self, x, y):
		# 何かしらの処理

	def func2(self, x, y, z):
		self.func1(x, y, z)
		# 何かしらの処理

	# 以下略

 これだけ見れば大体わかるかとは思いますが、「class ClassName():」のところがクラス名の定義です。「def __init__(self):」がコンストラクタで、そのあと「def func1(self, x, y):」と「def func2(self, x, y, z):」がクラスが持つ関数になります。

 全ての関数に書かれている引数のselfはインスタンス自身を指しており、クラス内の関数を使う場合には「self.関数名」のようにして呼び出します。

 かなり雑な説明をしましたが、これでクラス分けの方法がわかったので、テストコードをクラス分けしてみます。

 クラス分けすると以下のようになります。

・main.py

#
# テストコード2
#

# クラス分け
class SumClass():
	def __init__(self):
		print("init end")
	
	def sumLoop(self):
		while True:
			addend1 = input("input the addend1 : ")
			if (addend1 == "end"):
				break

			addend2 = input("input the addend2 : ")
			result = self.mySum(addend1, addend2)

			self.showSum(addend1, addend2, result)

	def mySum(self, add1, add2):
		return int(add1) + int(add2)
	
	def showSum(self, add1, add2, result):
		print(str(add1) + " + " + str(add2) + " = " + str(result))

# メイン関数
def main():
	sumInstance = SumClass()
	print("---start---")
	sumInstance.sumLoop()
	print("---end---")

if __name__ == '__main__':
    main()


2:ファイル分け
 クラス分けができたので、今度は処理を別ファイルに分ける方法です。

 main.pyのSumClass部分を切り出して「sumClass.py」というファイル名で保存します。

・sumClass.py

#
# sumClass.py
#
class SumClass():
	def __init__(self):
		print("init end")
	
	def sumLoop(self):
		while True:
			addend1 = input("input the addend1 : ")
			if (addend1 == "end"):
				break

			addend2 = input("input the addend2 : ")
			result = self.mySum(addend1, addend2)

			self.showSum(addend1, addend2, result)

	def mySum(self, add1, add2):
		return int(add1) + int(add2)
	
	def showSum(self, add1, add2, result):
		print(str(add1) + " + " + str(add2) + " = " + str(result))

 main.pyと同じ階層に「sum」という名前でフォルダを作成し、そのsumフォルダ内に「sumClass.py」を移動させます。
f:id:rikoubou:20190121164125p:plain

 次にmain.pyからsumClass.pyを呼び出す方法ですが、以下のように記述します。

from sum import sumClass as sc

「from」の後に記述するのがpythonの現在位置から呼び出したいフォルダの相対パスです。
「import」の後に記述するのが呼び出すpythonのファイル名、そして「as」の後に記述するのが呼び出すファイルを使いやすくするために新たに名付けた名前です。

 この一文を訳すと「実行するpythonファイルと同じ階層にあるsumというフォルダの中にあるsumClass.pyというファイルをscという名前で使う」という感じです。

 このimportの書き方は以下のページがわかりやすいので参照してください。

 これで外部ファイルの読み込み方法がわかったので、main.pyを以下のように修正します。

・main.py

#
# テストコード3
#
from sum import sumClass as sc # この文を追加して読み込み

# メイン関数
def main():
	sumInstance = sc.SumClass() # scという名前にしたのでそこでインスタンス関数を呼び出す
	print("---start---")
	sumInstance.sumLoop()
	print("---end---")

if __name__ == '__main__':
    main()

 これでクラスとファイル分けができました。


 以上がpythonのクラスとファイル分けの方法です。

 かなり雑ですし色々足りないとは思いますが、ざっくりやる方法ということで。


・参考資料