ダックタイピング、抽象クラス
ダックタイピング
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)
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
Author And Source
この問題について(ダックタイピング、抽象クラス), 我々は、より多くの情報をここで見つけました https://qiita.com/kirinboy96/items/55cc4e3c1e5f819e47c7著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .