質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1176閲覧

Python-クラス間でのメソッド引数の受渡しについて

happyriver

総合スコア5

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/05 11:19

編集2020/10/06 10:28

前提

マイナビから引用したものですが、下記の予約管理プログラムがあります。(https://news.mynavi.jp/article/python-22/)
ここでは3つのクラスを持っており、Clientクラスでは、「誰が」「いつ」という情報をSecretaryクラスに与えることにより予約が取れます。
同じ時間に予約があればFalseを返し、予約がなければその時間を抑えるという機能です。
また、ManagerクラスにはSecretaryクラスを利用して、何時に誰の予約か入っているかを一覧で出す機能もあります。
これをそのまま実行するとちゃんと動作します。しかしなぜ、どのような仕組みで動作しているのかがわからないため、質問させていただきました。

Python

1 2class Secretary: 3 def __init__(self): 4 self.appointment = {} 5 def request_appointment(self, when, who): 6 if(when in self.appointment): 7 return False 8 else: 9 self.appointment[when] = who 10 return True 11 def get_schedule(self): 12 return str(self.appointment) 13 14 15class Manager: 16 def __init__(self): 17 self.sara = Secretary() 18 def check_schedule(self): 19 schedule = self.sara.get_schedule() 20 print(schedule) 21 def get_secretary(self): 22 return self.sara 23 24 25class Client: 26 def __init__(self, name): 27 self.name = name 28 self.contact_point = None 29 def set_contact_point(self, contact_point): 30 self.contact_point = contact_point 31 def make_appointment(self, when): 32 if(self.contact_point): 33 is_success = self.contact_point.request_appointment(when, 34self.name) 35 print(self.name + " could book? : " + str(is_success)) 36 37bob = Manager() 38 39adam = Client('adam') 40 41adam.set_contact_point(bob.get_secretary()) 42adam.make_appointment('10:30') 43#adam could book? : True 44 45bob.check_schedule() 46#{'10:30': 'adam'} 47

質問①

不明点① まず、Clientの中の動作についてです。
・「Secretary」クラスの「request_appointment」メソツドでは、whenとwhoの2つの引数を指定しています。
・一方「Client」クラスの「make_appointment」メソッドでは、引数に「when」しか指定しておらず、「who」部分は指定されていません。

にも関わらず、実行結果を見てみると、adam.make_appointment('10:30')と、「when」情報のみで予約が取れています。
なぜこのようなことが(adamという名前を与えずに)予約が取れるのかが知りたいです。

考察

恐らく、これを実現させているのが「contact_point」にあるのかと推察しています。

「is_success = self.contact_point.request_appointment(when, self.name)」という機能によってでインスタンス作成時のnameを「who」として橋渡ししているのかな、と考えてます。そしてそれを実装するために、「self.contact_point」という受け皿を作り、「set_contact_point」というメソッドまで作っているのかと考えています。しかしこの「set_contact_point」メソッドに至っては、「オレの物はオレの物」と言っているようにしか聞こえず、何の意味があるのかわかりません。一体この随所に出てくる「contact_point」はどのような機能をはたしているのでしょう。

質問②

不明点② 次に、contact_pointが何なのかがわからないため、インスタンス作成後の「ada.set_contact_point(bob.get_secretary())」で何をしているのか、不明です。また、Managerクラスにある「get_secretary」も何の役割があるのかがわかりません。

以上、2点についてご教授お願いできますでしょうか。

追記

toast-uzさんの返答により、ほぼ理解して自分で書けるようになりました。
確かに下記のようにClientクラスを書き換えると、
adam .set_contact_point(bob.get_secretary())実行前にNoneだったcontact_pointはbob.get_secretary=Secretaryに置き換わっていることを確認しました。

Python

1 2 3class Client: 4 def __init__(self, name): 5 self.name = name 6 self.contact_point = None 7 def set_contact_point(self, contact_point): 8 self.contact_point = contact_point 9 print(self.contact_point) #追記 10 def make_appointment(self, when): 11 if (self.contact_point): 12 is_success = self.contact_point.request_appointment(when, self.name) 13 print(self.name + " could book? : " + str(is_success)) 14 else: 15 print(self.contact_point) #追記 16 17bob = Manager() 18adam = Client('ada') 19adam.make_appointment('10:30') 20#None 21 22adam.set_contact_point(bob.get_secretary()) 23#<__main__.Secretary object at 0x007E7030> 24

しかしすみません、あと1点だけ理解が届きませんでした。

is_success = self.contact_point.request_appointment(when, self.name)

部分なのですが、これはis_successという変数を作成してここに秘書のメソッドを代入しているだけのように思えます。

ところがこの文章だけで
self.contact_point.request_appointment(when, self.name)の実行まで行われています。
is_success = self.contact_point.request_appointment(when, self.name)
is_success
というように実行文が必要のように思うのですが、これはどういった機能で実現できているのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

考察は合っています。「contact_point」は、今やりとりしている秘書を表しているようです。
ada.set_contact_point(bob.get_secretary()は、Clientのadaが、Managerのbobの秘書とやりとりをはじめる、という意味です。

なぜ、わざわざ「やりとりする秘書」をセットしてから、実際の予約をするといった、無駄な手順を踏んでいるのか?と思われることでしょうが、そんなことは知ったことではありません。なぜなら、こういった学習コンテンツの例は、現実的意味は深く考えずに、文法を説明するために無理やりこじつけて作られていることが多いためです。所詮は学習コンテンツだと割り切って、あまりそのあたりを真剣に考えすぎないことも必要です。

投稿2020/10/05 11:43

toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

happyriver

2020/10/05 22:33 編集

早速のご回答ありがとうございます。 >「contact_point」は、今やりとりしている秘書を表しているようです。 なるほどピンと来るものがありました。 self.contact_point.request_appointmentがどういう仕組みかお手上げでしたが秘書ということであれば納得、そこから色々と繋がってきます。明日もう少し考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問