はじめに
この実験では、Python であるクラスが別のクラスのサブクラスであるかどうかをチェックする方法を学びます。これには、オブジェクト指向プログラミングの基本的な概念であるクラスの継承を探索することが含まれます。
まず、コンストラクタと speak メソッドを持つ親クラス Animal を作成します。次に、Animal を継承し、speak メソッドをオーバーライドする子クラス Dog と Cat を作成します。最後に、issubclass() 関数を使用し、__bases__ 属性を調べてサブクラスの関係を判断する方法を学びます。
クラス継承を探索する
このステップでは、オブジェクト指向プログラミング (OOP) の基本的な概念であるクラスの継承について学びます。継承を使うと、既存のクラス (親クラス) から属性とメソッドを継承する新しいクラス (子クラス) を作成できます。これによりコードの再利用が促進され、より組織的で保守しやすいコードを構築するのに役立ちます。
まず、Animal という単純な親クラスを作成しましょう。
## Create a file named animal.py in the ~/project directory
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print("Generic animal sound")
VS Code エディタを開き、~/project ディレクトリに animal.py という名前の新しいファイルを作成します。上記のコードをファイルにコピーして貼り付けます。このクラスには、name 属性を初期化する __init__ メソッド (コンストラクタ) と、一般的な動物の鳴き声を出力する speak メソッドがあります。
次に、Animal クラスを継承する Dog という子クラスを作成しましょう。
## Add the following code to animal.py
class Dog(Animal):
def speak(self):
print("Woof!")
上記のコードを animal.py ファイルに追加します。Dog クラスは、クラス名の後の括弧内に Animal を指定することで Animal を継承しています。Dog クラスはまた、speak メソッドをオーバーライドして独自の具体的な実装を提供しています。
次に、同じく Animal クラスを継承する Cat という別の子クラスを作成しましょう。
## Add the following code to animal.py
class Cat(Animal):
def speak(self):
print("Meow!")
上記のコードを animal.py ファイルに追加します。Cat クラスも Animal を継承し、speak メソッドをオーバーライドしています。
では、これらのクラスを使用するメインプログラムを作成しましょう。
## Create a file named main.py in the ~/project directory
from animal import Animal, Dog, Cat
animal = Animal("Generic Animal")
dog = Dog("Buddy")
cat = Cat("Whiskers")
animal.speak()
dog.speak()
cat.speak()
~/project ディレクトリに main.py という名前の新しいファイルを作成し、上記のコードをファイルにコピーして貼り付けます。このプログラムは、animal.py ファイルから Animal、Dog、Cat クラスをインポートします。そして、各クラスのインスタンスを作成し、それらの speak メソッドを呼び出します。
プログラムを実行するには、VS Code のターミナルを開き、~/project ディレクトリに移動します。
cd ~/project
次に、python コマンドを使用して main.py スクリプトを実行します。
python main.py
以下の出力が表示されるはずです。
Generic animal sound
Woof!
Meow!
これは、Dog クラスと Cat クラスが Animal クラスを継承し、speak メソッドの独自の具体的な実装を提供する方法を示しています。これは Python でのクラス継承の基本的な例です。
issubclass() 関数を使用する
このステップでは、issubclass() 関数を使ってあるクラスが別のクラスのサブクラスであるかどうかをチェックする方法を学びます。この関数は Python の組み込み関数で、最初の引数が 2 番目の引数のサブクラスである場合は True を返し、そうでない場合は False を返します。
前のステップの例を続けて、issubclass() 関数を使って Animal、Dog、Cat クラス間の関係をチェックしましょう。
VS Code エディタを開き、~/project ディレクトリに issubclass_example.py という名前の新しいファイルを作成します。以下のコードをファイルにコピーして貼り付けます。
## Create a file named issubclass_example.py in the ~/project directory
from animal import Animal, Dog, Cat
print(issubclass(Dog, Animal))
print(issubclass(Cat, Animal))
print(issubclass(Dog, Cat))
print(issubclass(Animal, Dog))
print(issubclass(Animal, Animal))
このプログラムは、前のステップで作成した animal.py ファイルから Animal、Dog、Cat クラスをインポートします。そして、issubclass() 関数を使って以下の関係をチェックします。
DogはAnimalのサブクラスですか?CatはAnimalのサブクラスですか?DogはCatのサブクラスですか?AnimalはDogのサブクラスですか?AnimalはAnimal自身のサブクラスですか?
プログラムを実行するには、VS Code のターミナルを開き、~/project ディレクトリに移動します。
cd ~/project
次に、python コマンドを使って issubclass_example.py スクリプトを実行します。
python issubclass_example.py
以下の出力が表示されるはずです。
True
True
False
False
True
この出力は以下のことを示しています。
DogはAnimalのサブクラスです (True)CatはAnimalのサブクラスです (True)DogはCatのサブクラスではありません (False)AnimalはDogのサブクラスではありません (False)Animalは自身のサブクラスです (True)
issubclass() 関数は、コード内のクラス間の継承関係をチェックするのに便利です。これは、コードが期待通りに動作していることを確認し、より堅牢で保守しやすいコードを書くのに役立ちます。
bases 属性を調べる
このステップでは、クラスの __bases__ 属性を調べて、その直接の親クラスを見つける方法を学びます。__bases__ 属性は、クラスの親クラスを含むタプルです。
前のステップの例を続けて、Animal、Dog、Cat クラスの __bases__ 属性を調べましょう。
VS Code エディタを開き、~/project ディレクトリに bases_example.py という名前の新しいファイルを作成します。以下のコードをファイルにコピーして貼り付けます。
## Create a file named bases_example.py in the ~/project directory
from animal import Animal, Dog, Cat
print(Dog.__bases__)
print(Cat.__bases__)
print(Animal.__bases__)
このプログラムは、前のステップで作成した animal.py ファイルから Animal、Dog、Cat クラスをインポートします。そして、各クラスの __bases__ 属性を出力します。
プログラムを実行するには、VS Code のターミナルを開き、~/project ディレクトリに移動します。
cd ~/project
次に、python コマンドを使って bases_example.py スクリプトを実行します。
python bases_example.py
以下の出力が表示されるはずです。
(<class 'animal.Animal'>,)
(<class 'animal.Animal'>,)
(<class 'object'>,)
この出力は以下のことを示しています。
DogクラスはAnimalクラスを継承しています。CatクラスはAnimalクラスを継承しています。Animalクラスはobjectクラスを継承しています。objectクラスは Python のすべてのクラスの基底クラスです。
__bases__ 属性は、クラスの継承階層を理解するのに便利です。これはデバッグや、より保守しやすいコードを書くのに役立ちます。
まとめ
この実験では、オブジェクト指向プログラミングの重要な概念である Python のクラス継承を探索しました。コンストラクタと speak メソッドを持つ親クラス Animal を作成し、その後 Animal を継承する子クラス Dog と Cat を定義しました。
これらの子クラスは、speak メソッドをオーバーライドして独自の具体的な実装を提供し、継承がコードの再利用と特殊化を可能にする方法を示しました。最後に、これらのクラスのインスタンスを作成し、speak メソッドを呼び出して異なる出力を確認しました。



