*物凄く大雑把で乱暴な例え(1)
例えば、音声認識の扉が有る。
その扉は、引戸かもしれないし、開き戸かもしれないし、シャッターや、回転扉かもしれない。
けれども、あなたがその扉に「開け!」といえば扉は開き、「閉じろ!」といえば扉は閉じる。
それは、扉は、現在どういう状態なのかを扉自身が把握しており(プロパティ)、
「開け!」「閉じろ!」という命令によって何をすべきか(メソッド)、を、扉自体が知っているから。
*物凄く大雑把で乱暴な例え(2)
例えば、変数の型であるintは、予め整数の数値を扱う為の仕様を持って居るが、実体は無い。
int型の変数を宣言する事で、整数を扱う変数が実体化する。
クラスも、雛型を定義しただけでは実体は存在しない。
そのクラスのインスタンスを宣言する事で、実体化する。
# OpenSesami_01 by Ryn November 27th, 2022 class Door: def __init__(self, name): # コンストラクタ self.name = name self.color = 'Blue' self.kagi = 'Close' def get_name(self): # ゲッターメソッド return (self.name) def get_color(self): return (self.color) def get_kagi(self): return (self.kagi) def open_sesami(self): # セッターメソッド print (self.name , 'Open Sesami!') if self.kagi == 'Close': self.kagi = 'Open' print (self.name , 'Opened') else: print (self.name , 'already open') return () def close_sesami(self): print (self.name , 'Close Sesami!') if self.kagi == 'Open': self.kagi = 'Close' print (self.name , 'Closed') else: print (self.name , 'already close') return () rooms = [ Door('11H') , Door('12H') , Door('13H')] # クラスのインスタンスを生成 flg = 0 while flg < 2: print() for x in rooms: print( x.get_name() , x.get_color() , x.get_kagi()) # ゲッターメソッドをコール in_room_name = input('RoomName or E:End → ') if in_room_name == 'E': flg = 2 else: flg = 0 for i in range(len(rooms)): if rooms[i].get_name() == in_room_name: flg = 1 in_kagi = (input('1:Open 2:Close → ')) if in_kagi == '1': rooms[i].open_sesami() elif in_kagi == '2': rooms[i].close_sesami() else: print ('Command Error') if flg == 0: print ('Room not found')
既に有るクラスを基に、新しいクラスを定義する。 此処では、引戸と開き戸を定義し、どちらの扉であっても、同じ言葉で動作させている。
# OpenSesami_02 by Ryn November 27th, 2022 class Door: def __init__(self, name): # コンストラクタ self.name = name self.color = 'Blue' self.kagi = 'Close' def get_name(self): # ゲッターメソッド return (self.name) def get_color(self): return (self.color) def get_kagi(self): return (self.kagi) def open_sesami(self): # セッターメソッド print (self.name , 'Open Sesami!') if self.kagi == 'Close': self.kagi = 'Open' print (self.name , 'Opened') else: print (self.name , 'already open') return () def close_sesami(self): print (self.name , 'Close Sesami!') if self.kagi == 'Open': self.kagi = 'Close' print (self.name , 'Closed') else: print (self.name , 'already close') return () class SlidingDoor(Door): # インヘリタンス def __init__(self, name): # コンストラクタ super().__init__(name) self.type = 'SlidingDoor' def get_type(self): # ゲッターメソッド return (self.type) class HingedDoor(Door): # インヘリタンス def __init__(self, name): # コンストラクタ super().__init__(name) self.color = 'Red' self.type = 'HingedDoor' def get_type(self): # ゲッターメソッド return (self.type) rooms = [ SlidingDoor('11H') , SlidingDoor('12H') , HingedDoor('13H')] # クラスのインスタンスを生成 flg = 0 while flg < 2: print() for x in rooms: print( x.get_name() , x.get_type() , x.get_color() , x.get_kagi()) # ゲッターメソッドをコール in_room_name = input('RoomName or E:End → ') if in_room_name == 'E': flg = 2 else: flg = 0 for i in range(len(rooms)): if rooms[i].get_name() == in_room_name: flg = 1 in_kagi = (input('1:Open 2:Close → ')) if in_kagi == '1': rooms[i].open_sesami() elif in_kagi == '2': rooms[i].close_sesami() else: print ('Command Error') if flg == 0: print ('Room not found')
扉のタイプによって、同じ命令でも違う動作をさせる例。
例えば『「攻撃!」という同じ命令によって戦士と魔法使いとで違う動作をさせる』など、
アドベンチャーゲームなどで良く使われる。
# OpenSesami_03 by Ryn November 27th, 2022 class Door: def __init__(self, name): # コンストラクタ self.name = name self.color = 'Blue' self.kagi = 'Close' def get_name(self): # ゲッターメソッド return (self.name) def get_color(self): return (self.color) def get_kagi(self): return (self.kagi) class SlidingDoor(Door): # インヘリタンス def __init__(self, name): # コンストラクタ super().__init__(name) self.type = 'SlidingDoor' def get_type(self): # ゲッターメソッド return (self.type) def right_door(self): # セッターメソッド if self.kagi == 'Close': self.kagi = 'Open' print (self.name , 'Opened') else: print (self.name , 'already open') return () def left_door(self): if self.kagi == 'Open': self.kagi = 'Close' print (self.name , 'Closed') else: print (self.name , 'already close') return () def pull_door(self): print (self.name , 'Can not pull !') return () def push_door(self): print (self.name , 'Can not push !') return () class HingedDoor(Door): # インヘリタンス def __init__(self, name): # コンストラクタ super().__init__(name) self.color = 'Red' self.type = 'HingedDoor' def get_type(self): # ゲッターメソッド return (self.type) def right_door(self): print (self.name , 'Can not move to the right !') return () def left_door(self): print (self.name , 'Can not move to the left !') return () def pull_door(self): # セッターメソッド if self.kagi == 'Close': self.kagi = 'Open' print (self.name , 'Opened') else: print (self.name , 'already open') return () def push_door(self): if self.kagi == 'Open': self.kagi = 'Close' print (self.name , 'Closed') else: print (self.name , 'already close') return () rooms = [ SlidingDoor('11H') , SlidingDoor('12H') , HingedDoor('13H')] flg = 0 while flg < 2: print() for x in rooms: print( x.get_name() , x.get_type() , x.get_color() , x.get_kagi()) in_room_name = input('RoomName or E:End → ') if in_room_name == 'E': flg = 2 else: flg = 0 for i in range(len(rooms)): if rooms[i].get_name() == in_room_name: flg = 1 in_kagi = (input('1:Push 2:Pull 3:Right 4:Left → ')) if in_kagi == '1': rooms[i].push_door() elif in_kagi == '2': rooms[i].pull_door() elif in_kagi == '3': rooms[i].right_door() elif in_kagi == '4': rooms[i].left_door() else: print ('Command Error') if flg == 0: print ('Room not found')