Pythonでオブジェクト指向とはなんなのかを理解する #3

振り返りと今回の記事で作成するもの

この連載ではPythonを使ってコンソール上で動くTwitterみたいなアプリを作っていきます。前回の第二回ではアカウントの新規作成と、ログイン機能を作成しました。今回はログインしたのちにツイートを行えるような機能を実装していきます。

今回の記事を実装した後のフォルダ構成は以下のようになります。modelsフォルダのtweetNaiyou.pyが追加される他、tweet.pyとaccount.pyに変更があります。

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

tweetNaiyou.py

一つ一つの呟きを表すクラスを作ります。

class tweetNaiyou(object):
	def __init__(self, tuinusiId, naiyou):
		self.tuinusiId = tuinusiId
		self.naiyou = naiyou

tweetNaiyouクラスは一つ一つの呟きを表すので、呟きをした人物のidと呟きの内容を持たせるようにします。今回はこれだけです。

 



account.py

account.pyは一つ一つのアカウントを管理するためのクラスです。

from twitter.models import tweetNaiyou

class Account(object):

	def __init__(self, id, password):
		self.id = id
		self.password = password
                # 自分のツイートを保持するリストを追加
		self.tweetList = []

        # ツイートをするときに呼び出されるメソッド、ツイート内容をユーザから受け取りツイートを作成する。
	def createTweet(self):
		print("ツイート:", end='')
		naiyou = input()
		self.tweetList.append(tweetNaiyou.tweetNaiyou(self.id, naiyou))
        
        # 自身のツイートを全件表示
	def printTweet(self):
		for tweet in self.tweetList:
			print(tweet.tuinusiId + ': ', end='')
			print(tweet.naiyou)

先ほど作成したtweetNaiyouをインポートします。その上でコンストラクタに自分のツイートを保持するリストを追加しています。

さらにcreateTweetメソッドを追加します。このメソッドを呼び出すことで新しくツイートできるようにします。具体的な処理内容としては、input関数を使ってユーザからツイート内容の入力を受け付けます。そして受け取ったツイートの内容と、自身のidを持ったtweetNaiyouのインスタンを作成します。そのtweetNaiyouのインスタンスをtweetListに追加します。

次に自身のツイートを表示するprintTweetメソッドを追加します。自身のtweetListをfor文で回してそれぞれのidと内容を出力します。

 



tweet.py

最後にtweet.pyを変更します。tweetModeとinputIdPassの二つのメソッドを追加しました。

from twitter.models import loginAdmin

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

	while(True):
		# 次に行うアクションの入力を待ち受ける
		print("何をしますか?(lでログイン/ aでアカウント新規作成/ qで終了)→", end='')
		nyuryoku=input()
		
		if (nyuryoku=='q'):
			break;
		elif(nyuryoku=='l'):
			dict = inputIdPass()

			# loginAdminのloginメソッドを呼び出す
			loginAccount = accountAdmin.login(dict['id'], dict['password']);
			if(loginAccount):
				print('ログインに成功しました')
				tweetMode(loginAccount)
			else:
				print('ログインに失敗しました')
		elif(nyuryoku=='a'):
			print('新規アカウントを作成します。')
			dict = inputIdPass()

			# loginAdminのsignupメソッドを呼び出す
			accountAdmin.signup(dict['id'], dict['password']);
			accountAdmin.printAccount()


def tweetMode(loginAccount):
	while True:
		print('操作を選択してください。(l: ログアウト t: ツイート) ->', end='')
		nyuryoku = input()
		if(nyuryoku == 'l'):
			break
		elif nyuryoku == 't':
			loginAccount.createTweet()
			loginAccount.printTweet()


def inputIdPass():
	dict = {'id': '', 'password': ''}
	# idの入力を受け付ける
	print('idを入力してください→', end='')
	dict['id'] = input()

	# passwordの入力を受け付ける
	print("passwordを入力してください→", end='')
	dict['password'] = input()

	return dict

まずinputIdPassメソッドですが、このメソッドはidやパスワードの入力を受け付ける処理をまとめたもので、新機能には関係ありません。idとパスワードを受け取って、それを辞書型で返します。

次にtweetModeメソッドです。こちらはユーザがログインした後に呼び出されるメソッドです。現在ユーザが行える処理はツイートとログアウトです。そのいずれを行うかユーザからの入力によって決めます。

ツイートが選択された場合、acount.pyで追加したcreateTweetとprintTweetを呼び出します。ログアウトが選択された場合while文を抜けてメソッドが終了しloginModeに戻ります。

 



動作確認

$ python main.py
何をしますか?(lでログイン/ aでアカウント新規作成/ qで終了)→a
新規アカウントを作成します。
idを入力してください→tanaka
passwordを入力してください→taro
何をしますか?(lでログイン/ aでアカウント新規作成/ qで終了)→l
idを入力してください→tanaka
passwordを入力してください→taro
ログインに成功しました
操作を選択してください。(l: ログアウト t: ツイート) ->t
ツイート:tanaka desu
tanaka: tanaka desu
操作を選択してください。(l: ログアウト t: ツイート) ->t
ツイート:hello world
tanaka: tanaka desu
tanaka: hello world
操作を選択してください。(l: ログアウト t: ツイート) ->t
ツイート:これからもツイッターみたいなの作っていきたいです
tanaka: tanaka desu
tanaka: hello world
tanaka: これからもツイッターみたいなの作っていきたいです
操作を選択してください。(l: ログアウト t: ツイート) ->l
何をしますか?(lでログイン/ aでアカウント新規作成/ qで終了)→q

コメント

タイトルとURLをコピーしました