抽象クラス1
抽象メソッドをもつクラスのことを抽象クラスという。抽象クラスを継承した子クラスにおいては、親クラスの中の抽象メソッドをオーバーライドする必要がある。
抽象クラスの定義
(1), (2) で抽象クラスを定義している。抽象クラスの中ではデコレータ「@abstractmethod」を用いて抽象メソッドを定義することができる。
code:abc1.py
from abc import ABCMeta, abstractmethod # (1)
# Animalは抽象クラス
class Animal(metaclass=ABCMeta): # (2)
@abstractmethod
def __init__(self):
pass
@abstractmethod
def voice(self):
pass
def talk(self):
print('私は', self.name, 'という名前の', self.spicies, 'です')
# Dogクラスは抽象クラスであるAnimalを継承
class Dog(Animal):
def __init__(self, name):
self.name = name
self.spicies = 'Dog'
# 以下のコメントを外すと実行できる
# def voice(self):
# print('犬はバウワウと吠えます')
print('# 実験1 --------------')
d1 = Dog('Pochi') # ポチ・インスタンス
d1.talk()
d1.voice()
参考:pass文
上記プログラムを実行すると以下のエラーを吐いて停止する。
TypeError: Can't instantiate abstract class Dog with abstract method voice
(意味:抽象メソッドvoiceをもつ抽象クラスDogをインスタンス化できません)
コメントを外し、親クラスのvoiceをオーバーライドしてください。
クラスAnimalは __init__ と sound を抽象メソッドとする抽象クラスである。
抽象メソッドsoundは中身が空なので、子クラス側で全ての処理を定義する必要がある。
__init__は基本的な処理を定義しておき、子クラスはそれを利用している
抽象クラスはインスタンス化できない
code:(続き)abc1.py
a1 = Animal()
子クラス側では、親クラスが有する全ての抽象メソッドをオーバーライドする必要がある。
code:(続き)abc2.py
class Fox(Animal):
def __init__(self, name):
self.name = name
self.spicies = 'Kitakitsune'
f1 = Fox('Gon')
https://scrapbox.io/files/65091166f5853f001bcdba49.png
/icons/hr.icon
※ ブラウザのバックボタンで戻る