*物凄く大雑把で乱暴な例え(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')