# -*- coding: utf-8 -*-
"""
親クラスのコンストラクタの活用（Animal, Dog, Snake）
"""


# 動物のクラス
class Animal:
    ashi    = 4   # 足の本数
    nakigoe = ""  # 鳴き声（とりあえず無音）

    def __init__(self, namae:str):
        self.namae = namae

    def get_ashi(self):
        return self.ashi

    def get_namae(self):
        return self.namae

    # 歩く
    def aruku(self):
        print("てくてく")

    # 鳴く
    def naku(self):
        print(self.nakigoe)



# 犬のクラス
class Dog(Animal):
    nakigoe  = "ワン！"  # 鳴き声は共通の形で設定

    # 名前と飼い主を指定
    def __init__(self, namae:str, kainushi:str="不明"):
        super().__init__(namae)
        self.kainushi = kainushi

    # 飼い主を聞く
    def ouchi(self):
        return self.kainushi  # 文字列を戻す

    # 散歩する（繰り返し歩く）
    def sanpo(self, n=3):
        print("行ってきます")
        for i in range(n):
            self.aruku()
        print("ただいま")


# 蛇のクラス
class Snake(Animal):
    ashi = 0

    """ 指示ここから """
    # このコメントブロックの下に，
    # 蛇クラスのコンストラクタを宣言しなさい．
    # その際，インスタンス変数 doku について，
    # True/False を設定できるようにしなさい．
    def __init__(self, namae:str, doku:bool):
        super().__init__(namae)
        self.doku = doku
    
    """ 指示ここまで """

    # 歩く
    def aruku(self):
        print("するする")

    # 咬む（毒の有無で挙動が変わる）
    def kamu(self):
        if self.doku:
            print("毒牙武！")
        else:
            print("ガブ！")

def main():
    # インスタンスを生成
    inu1  = Dog("ジョン")
    inu2  = Dog(input("犬の名前："), input("飼い主："))
    hebi1 = Snake("ニョロ", False)
    hebi2 = Snake(input("蛇の名前："), (input("毒蛇なら1，普通なら0：") >= "1"))
    print()  # 採点の都合上の空行

    # インスタンスメソッドの実行
    # f文字列の中にはメソッドを入れてもＯＫ
    print(f"{inu1.get_namae()}の足は{inu1.get_ashi()}本")
    inu1.sanpo()
    print(inu1.ouchi())
    print(f"{inu2.get_namae()}の足は{inu2.get_ashi()}本")
    inu2.sanpo()
    print(inu2.ouchi())

    print(f"{hebi1.get_namae()}の足は{hebi1.get_ashi()}本")
    hebi1.aruku()
    hebi1.kamu()
    print(f"{hebi2.get_namae()}の足は{hebi2.get_ashi()}本")
    hebi2.aruku()
    hebi2.kamu()


if __name__ == "__main__":
    main()
