ダックタイピング、抽象クラス


ダックタイピング

qiita.py
class Person(object):
    def __init__(self,age=1):
#デフォルト引数でageを1に設定
        self.age = age

    def drive(self):
        if self.age >= 18:
            print("ok")
#18以上ならOK
        else:raise Exception("No Drive")
#それ以外はNo driveを表示させるエラー

class Baby(Person):
#Personを継承させる
    def __init__(self,age=1):
#デフォルト引数でageを1に設定
        if age < 18:
            super().__init__(age)
        else:raise ValueError

class Adult(Person):
#Personを継承させる
    def __init__(self,age=18):
        if age >= 18:
            super().__init__(age)
        else:raise ValueError

baby = Baby()
adult = Adult()

class Car(object):
    def __init__(self,model=None):
        #ベースクラスは何も設定しない
        self.model = model

    def run(self):
        print("run")
    def ride(self,person):
        person.drive()
#personのdriveメソッドを呼び出す

car = Car()
car.ride(baby)

実行結果のエラー内容
No driveと表示されていることがわかる

Exception: No Drive

このように書き換える事も可能
PersonというクラスではなくBabyにdriveメソッドを入れる
この場合継承するクラスに必ずdriveを定義する必要がある

qiita.py
class Baby(Person):
#Personを継承させる
    def __init__(self,age=1):
        if age < 18:
            super().__init__(age)
        else:raise ValueError

    def drive(self):
        raise Exception("No Drive")

抽象クラス

abcというライブラリを使用する
ここではdriveについて何もしないが、継承するクラスではこのdriveを実装しないとエラーが発生する

qiita.py
import abc

class Person(metaclass=abc.ABCMeta):
    #このクラスが抽象クラスだと明示
    def __init__(self,age=1):
        self.age = age

    @abc.abstractmethod
    def drive(self):
        pass
    #ここでは何もやらない

実行結果
adultという継承クラスでdriveメソッドを作らなかった場合

TypeError: Can't instantiate abstract class Adult with abstract methods drive