Python

Pythonでオブジェクト指向を理解する #1

はじめに

この連載ではPythonを使ってTwitterみたいなアプリを作りながら、オブジェクト指向への理解を深めていきたいと思っています。
クラスとか、インスタンス化とか勉強はしたけどモヤモヤしていて全然意味わからんと思っていた過去の自分に説明するつもりで書いていこうと思います。
MySQLやDjangoなどの技術は使わずに、純粋なPythonのみでコンソール上で動くTwitterぽいやつを作っていけたらなと思います。

対象の読者としては「Pythonの基本文法を勉強したけど、オブジェクト指向ってなんやねん」と思っている方や「Pythonの基本文法はマスターしたから、なんか作ってみてえ」といったような方を想定して書いています。両方とも過去の自分です。

作っていく過程で「ここのクラス設計おかしいだろ」とか「クラス名変じゃね」とか「フォルダ構成もっといい感じにできるやろ」とかあればご指摘いただけると幸いです。よろしくお願いします。

環境

動作環境は以下の通りです。

  • MacOS catalina 10.15.7
  • Python 3.8.1

では早速作っていきたいと思います。

 [temp id=2]

ログインシステムを作っていく

まず最初にログインシステムを作っていきます。今回の記事で作るフォルダやファイルの構成は以下のようになります。

.
├── main.py
├── twitter
│   ├── controller
│   │   ├── __pycache__
│   │   └── tweet.py
│   ├── models
│   │   ├── __pycache__
│   │   ├── account.py
│   │   └── loginAdmin.py
│   └── views

account.py

最初にaccount.pyを作っていきます。一つ一つのアカウントを管理するためのクラスです。
最初は特にメソッドは持たせず、コンストラクタだけ作成しました。
個々のアカウントはidとpasswordを持ちます。

class Account(object):

	def __init__(self, id, password):
		self.id = id
		self.password = password

loginAdmin.py

次にloginAdmin.pyを作っていきます。LoginAdminクラスを作成しログインに関する処理を行う関数を持たせます。

コンストラクタ内で先ほど作成したAccountクラスを使っています。3つほど自動でアカウントを作成するような記述をしました。Accountクラスのインスタンスをまとめて保持するaccountListを作ってその中に入れています。

loginメソッドはidとpasswordを受け取ります。accountListに格納されているAccountのインスタンスを一つずつ取り出し、受け取ったidとpasswordが一致しているアカウントがあるか確認します。一致しているアカウントが存在したら、そのアカウントを返します。一致したアカウントがなければ何も返しません。

from twitter.models.account import Account

class LoginAdmin(object):

	def __init__(self):
		self.accountList=[]
		self.accountList.append(Account('Yuka', 'Ooyama'))
		self.accountList.append(Account('Taro', 'Tanaka'))
		self.accountList.append(Account('Makoto', 'Suzuki'))

	def login(self, id, password):
		for account in self.accountList:
			if (account.id == id) and (account.password == password):
				return account

 [temp id=2]

tweet.py

次にtweet.pyを作ります。loginMode関数を作りました。はじめにLoginAdminのインスタンスを作成します。この時点でLoginAdminのコンストラクタが実行され、アカウントが三つ作られます。次にwhileループに入っていきます。input関数を使ってidとpasswordをキーボードから受け取ります。この時もしidにqが入力された場合にはwhileループを抜けてプログラムが終了します。idとpasswordが入力されたら、先ほど作ったloginメソッドに渡します。login関数はidとpasswordが一致したアカウントを返してくれるので、アカウントが返ってきたら「ログインに成功しました」と出力し、アカウントがなければ「ログインに失敗しました」と出力します。

from twitter.models import loginAdmin

def loginMode():
	accountAdmin = loginAdmin.LoginAdmin();

	while(True):
		print("idを入力してください(qで終了)→", end='')
		id=input()
		if (id=='q'):
			break;
		print("passwordを入力してください→", end='')
		password=input()
		loginAccount = accountAdmin.login(id, password);
		if(loginAccount):
			print('ログインに成功しました')
		else:
			print('ログインに失敗しました')

main.py

最後はmain.pyです。と言ってもtweet.pyのloginModeを呼び出すだけです。

import twitter.controller.tweet

twitter.controller.tweet.loginMode();

これによってmain.pyを実行するとログインの処理が実行されます。

idを入力してください(qで終了)→Taro
passwordを入力してください→Tanaka
ログインに成功しました
idを入力してください(qで終了)→taro
passwordを入力してください→tanaka
ログインに失敗しました
idを入力してください(qで終了)→q

まとめ

今回の記事ではPythonでTwitterみたいなアプリを作るための最初の準備をしました。具体的にはAccountクラス、loginAdminクラスを作成しloginModeメソッドを使ってログイン機能を作成しました。次回は新規アカウント作成を行えるように機能を追加していきます。

-Python