キーワード辞典
物凄く大雑把なPython

登録日 21/12/03   更新日 21/12/03



クラス/クラスの継承

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



クラスの継承(1)

既に有るクラスを基に、新しいクラスを定義する。 此処では、引戸と開き戸を定義し、どちらの扉であっても、同じ言葉で動作させている。

# 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')



クラスの継承(2)

扉のタイプによって、同じ命令でも違う動作をさせる例。
例えば『「攻撃!」という同じ命令によって戦士と魔法使いとで違う動作をさせる』など、 アドベンチャーゲームなどで良く使われる。

# 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')













[ 黒板消しとチョーク受けの画像 ]