Pythonで学ぶ!クラスと継承の全手順10選

Pythonで学ぶクラスと継承のイメージ図Python
この記事は約15分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればサンプルコードを活用して機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Pythonは世界中で広く使われているプログラミング言語の一つであり、初心者にも親しまれている理由の一つに、そのシンプルで直感的な文法が挙げられます。

本記事では、Pythonの重要な概念である「クラス」と「継承」について、10のサンプルコードを用いて具体的に解説します。

●Pythonとは

Pythonは、汎用的なプログラミング言語で、そのコードの読みやすさと、さまざまな用途での利用が可能な点が特徴です。

Web開発、データ分析、機械学習、AI開発など、多岐にわたる分野で利用されています。

●クラスとは

クラスとは、オブジェクト指向プログラミングの核心的な概念の一つで、オブジェクトの設計図のようなものと考えることができます。

同じような振る舞いや特性を持つオブジェクトを作るためのテンプレートであり、そのクラスから具体的なオブジェクト(インスタンス)を作り出すことができます。

○クラスの定義方法

Pythonでクラスを定義するには、”class”キーワードを用います。

クラスの定義の基本的な形を紹介します。

class MyClass:
    pass

このコードでは、MyClassという名前のクラスを定義しています。

passは、何もしないという意味のPythonのキーワードで、ここでは特に機能を持たないクラスを作っています。

○クラスのインスタンス化

クラスから具体的なオブジェクトを作ることを「インスタンス化」と言います。

インスタンス化の方法を紹介します。

class MyClass:
    pass

my_instance = MyClass()

この例では、先ほど定義したMyClassから、my_instanceというインスタンスを作成しています。

●継承とは

継承は、既存のクラス(親クラス)の属性やメソッドを新たなクラス(子クラス)に受け継ぐことです。

これにより、同じような機能を持つクラスを新たに作る際に、コードの再利用や機能の拡張が容易になります。

○継承の定義方法

Pythonで継承を定義するには、子クラスを定義する際に、親クラスの名前を括弧内に記述します。

継承の基本的な形を紹介します。

class ParentClass:
    pass

class ChildClass(ParentClass):
    pass

このコードでは、ParentClassという名前の親クラスを定義し、その後にChildClassという名前の子クラスを定義しています。

ここでは子クラスが親クラスの全ての属性やメソッドを継承します。

○継承を用いたクラスのカスタマイズ

継承したクラスは、親クラスの属性やメソッドを引き継ぐだけでなく、新たに独自の属性やメソッドを追加したり、親クラスのメソッドをオーバーライド(上書き)したりすることも可能です。

これにより、既存のクラスをベースにしながらも、独自の機能を持つ新たなクラスを容易に作り出すことができます。

class ParentClass:
    def hello(self):
        print("Hello from ParentClass")

class ChildClass(ParentClass):
    def hello(self):
        print("Hello from ChildClass")

このコードでは、ChildClassが親クラスParentClassのメソッドhelloをオーバーライドしています。

これにより、ChildClassのインスタンスでhelloメソッドを呼び出すと、「Hello from ChildClass」と表示されます。

parent = ParentClass()
child = ChildClass()

parent.hello()  # Output: Hello from ParentClass
child.hello()  # Output: Hello from ChildClass

このように、Pythonのクラスと継承の仕組みを理解することで、より効率的かつ柔軟なコードを書くことが可能になります。

●Pythonでのクラスと継承のサンプルコード

Pythonのクラスと継承について詳しく学ぶために、10の詳細なサンプルコードを用いて一緒に学んでいきましょう。

これらのコードは、Pythonの基本的な使い方から応用例までを視覚的に理解するためのものです。

○サンプルコード1:クラスの定義とインスタンス化

Pythonでクラスを定義し、そのクラスからインスタンスを生成する基本的なコードを紹介します。

この例では、「Dog」というクラスを定義し、「pochi」というインスタンスを生成しています。

class Dog:
    pass

pochi = Dog()

このコードでは、”Dog”というクラスを定義し、そのクラスから具体的なインスタンス”pochi”を生成しています。

この”pochi”はDogクラスのインスタンスであり、Dogクラスの属性やメソッドを利用することができます。

○サンプルコード2:クラスのメソッドと属性

次に、クラス内にメソッドと属性を定義し、それらをインスタンスから呼び出す方法を紹介します。

この例では、「Dog」というクラスに「name」という属性と「bark」というメソッドを定義し、それらを「pochi」というインスタンスから呼び出しています。

class Dog:
    def __init__(self, name):
        self.name = name

    def bark(self):
        return f"{self.name} says woof!"

pochi = Dog("Pochi")
print(pochi.name)  # Output: Pochi
print(pochi.bark())  # Output: Pochi says woof!

このコードでは、Dogクラスに”init“という特別なメソッドを定義しています。

これは初期化メソッドと呼ばれ、クラスからインスタンスが生成される際に自動的に呼び出されます。

init“メソッドでは、”name”という属性を初期化しています。

次に、”bark”というメソッドを定義しています。

このメソッドは、犬の名前と一緒に”woof!”と返す機能を持っています。

このメソッドをpochiのインスタンスから呼び出すと、”Pochi says woof!”と表示されます。

○サンプルコード3:クラスの初期化メソッドinit()

次に、クラスの初期化メソッド”init“の役割について詳しく見ていきましょう。

このメソッドは、クラスから新たなインスタンスを生成する際に、そのインスタンスの初期設定を行うために使用されます。

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

pochi = Dog("Pochi", 5)
print(pochi.name)  # Output: Pochi
print(pochi.age)  # Output: 5

このコードでは、Dogクラスのinitメソッドで、犬の名前と年齢を初期化しています。

ここで指定した値は、pochiインスタンスの属性として設定されます。

それらの属性は、”pochi.name”や”pochi.age”という形で参照することができます。

○サンプルコード4:クラスの継承

続いては、Pythonでのクラスの継承について学びます。

クラスの継承とは、あるクラス(親クラス)の属性やメソッドを別のクラス(子クラス)に引き継ぐ機能です。

class Animal:
    def __init__(self, name):
        self.name = name

class Dog(Animal):
    def bark(self):
        return f"{self.name} says woof!"

pochi = Dog("Pochi")
print(pochi.name)  # Output: Pochi
print(pochi.bark())  # Output: Pochi says woof!

このコードでは、Animalクラスを定義し、その後にDogクラスを定義しています。

DogクラスはAnimalクラスを継承しているため、Animalクラスで定義したname属性を使用することができます。

さらに、Dogクラス独自のメソッドとしてbarkを定義しています。

○サンプルコード5:オーバーライドとスーパークラスの呼び出し

次に、子クラスが親クラスのメソッドを上書き(オーバーライド)し、親クラスのメソッドを明示的に呼び出す方法を見ていきます。

class Animal:
    def greet(self):
        return "Hello"

class Dog(Animal):
    def greet(self):
        return super().greet() + ", woof!"

pochi = Dog()
print(pochi.greet())  # Output: Hello, woof!

このコードでは、Dogクラスが親クラスAnimalのgreetメソッドをオーバーライドしています。

また、super()を使用することで、親クラスの同名のメソッドを呼び出すことができます。

○サンプルコード6:複数のクラスの継承(多重継承)

Pythonでは、一つのクラスが複数のクラスを継承することも可能です。

これを多重継承と呼びます。

下記の例では、DogクラスがAnimalクラスとPetクラスの2つを継承しています。

class Animal:
    def __init__(self, name):
        self.name = name

class Pet:
    def play(self):
        return f"{self.name} is playing"

class Dog(Animal, Pet):
    def bark(self):
        return f"{self.name} says woof!"

pochi = Dog("Pochi")
print(pochi.name)  # Output: Pochi
print(pochi.play())  # Output: Pochi is playing
print(pochi.bark())  # Output: Pochi says woof!

このコードでは、DogクラスはAnimalクラスからname属性を、Petクラスからplayメソッドを継承しています。

そして、Dogクラス自身のメソッドとしてbarkを追加しています。

○サンプルコード7:プライベート属性とゲッター、セッター

Pythonでは、クラスの内部でのみ使用されるプライベートな属性を定義することが可能です。

下記の例では、Dogクラスにプライベートな属性__secretとその取得・設定を行うメソッドを定義しています。

class Dog:
    def __init__(self, name, secret):
        self.name = name
        self.__secret = secret

    def get_secret(self):
        return self.__secret

    def set_secret(self, secret):
        self.__secret = secret

pochi = Dog("Pochi", "I love cats.")
print(pochi.get_secret())  # Output: I love cats.
pochi.set_secret("I love dogs more.")
print(pochi.get_secret())  # Output: I love dogs more.

このコードでは、Dogクラスに__secretというプライベート属性を定義しています。

__secretはクラスの外部から直接アクセスすることはできませんが、get_secretとset_secretというメソッドを通じて間接的に取得や設定が可能です。

○サンプルコード8:プロパティを使用した属性の取得と設定

Pythonでは、プロパティを使用してクラスの属性の取得や設定を制御することも可能です。

下記の例では、Dogクラスにsecretプロパティとそのgetter・setterメソッドを定義しています。

class Dog:
    def __init__(self, name, secret):
        self.name = name
        self.__secret = secret

    @property
    def secret(self):
        return self.__secret

    @secret.setter
    def secret(self, secret):
        self.__secret = secret

pochi = Dog("Pochi", "I love cats.")
print(pochi.secret)  # Output: I love cats.
pochi.secret = "I love dogs more."
print(pochi.secret)  # Output: I love dogs more.

このコードでは、Dogクラスに__secretというプライベート属性を定義しています。

さらに、そのプライベート属性に対して@propertyデコレータを使用してgetterメソッドを、@secret.setterデコレータを使用してsetterメソッドを定義しています。

これにより、外部からはプライベート属性に直接アクセスするのではなく、secretという名前のプロパティを通じて間接的に取得や設定が可能になります。

○サンプルコード9:クラスメソッドとスタティックメソッド

Pythonのクラスでは、インスタンスに依存しないメソッドを定義することができます。

これにはクラスメソッドとスタティックメソッドの2種類があります。

下記の例では、Dogクラスにそれぞれを定義しています。

class Dog:
    _total = 0

    @classmethod
    def increment_total(cls):
        cls._total += 1

    @staticmethod
    def bark():
        return "woof!"

Dog.increment_total()
print(Dog._total)  # Output: 1
print(Dog.bark())  # Output: woof!

このコードでは、Dogクラスに_totalというクラス変数、increment_totalというクラスメソッド、そしてbarkというスタティックメソッドを定義しています。

クラスメソッドは、クラス自体を操作するメソッドであり、clsという特別な第一引数を取ります。

スタティックメソッドは、クラスやインスタンスと無関係に動作するメソッドであり、特別な引数を必要としません。

○サンプルコード10:抽象クラスとインターフェース

Pythonで抽象クラスとインターフェースを利用する際には、abcモジュールを使用します。

下記のコードは、Animalという抽象クラスを定義し、この抽象クラスを継承したDogクラスとCatクラスを作成しています。

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def make_sound(self):
        pass

class Dog(Animal):
    def make_sound(self):
        return "Woof!"

class Cat(Animal):
    def make_sound(self):
        return "Meow!"

dog = Dog()
cat = Cat()

print(dog.make_sound())  # Output: Woof!
print(cat.make_sound())  # Output: Meow!

このコードでは、Animalという抽象クラスを作成し、その中にmake_soundという抽象メソッドを定義しています。

このメソッドは具体的な実装がなく、サブクラスでオーバーライドする必要があります。

その後、DogクラスとCatクラスを作成し、Animalクラスからmake_soundメソッドをオーバーライドしています。

これにより、DogインスタンスとCatインスタンスがそれぞれ異なる音を出力します。

●クラスと継承の注意点と対策

Pythonでクラスと継承を用いる際には、いくつか注意点があります。

①親クラスのプライベート属性には直接アクセスできません

サブクラスから親クラスのプライベート属性に直接アクセスすることはできません。

これはPythonがオブジェクト指向の原則であるカプセル化を尊重しているからです。

代わりに、親クラス内でgetterメソッドやsetterメソッドを定義することで間接的にアクセスすることが可能です。

②多重継承を用いる際の注意

Pythonでは多重継承が許可されていますが、複数の親クラスが同名のメソッドを持つ場合など、意図しない動作が発生する可能性があります。

そのため、多重継承を用いる際には各親クラスの役割やメソッドの機能を十分に理解した上で利用することが必要です。

●Pythonクラスと継承のカスタマイズ方法

Pythonのクラスと継承は、非常に柔軟で拡張性が高いため、多くのカスタマイズが可能です。

それではいくつか例を紹介していきます。

①メタクラスを使用する

メタクラスはクラスのクラス、つまりクラスの振る舞いを定義するためのクラスです。

これを使用することで、クラスの作成方法や振る舞いをカスタマイズできます。

②Mix-inを使用する

Mix-inは特定の機能だけを提供するクラスのことを指します。

これを使用すると、複数のクラスからメソッドを借りてきて新たなクラスを作成することが可能です。

これによりコードの再利用性を高めることができます。

③デコレータを使用する

デコレータは関数やメソッドの振る舞いを変更するための機能です。

これを使用すると、メソッドの前後で特定の処理を挿入したり、メソッドの結果をキャッシュしたりすることが可能です。

まとめ

Pythonでのクラスと継承の基本的な使い方から、応用例まで10の詳細なサンプルコードを通して学びました。

それぞれのコードでは、Pythonのオブジェクト指向の特性を利用して様々なクラスと継承のパターンを作り出すことができることを理解しました。

また、クラスと継承の注意点と対策、さらにはPythonのクラスと継承のカスタマイズ方法についても考察しました。

これらの知識を活用して、Pythonのオブジェクト指向プログラミングをさらに理解し、コードの効率性、拡張性、再利用性を高めていきましょう。

これらはPythonプログラミングの重要な部分であり、より高度なプログラミングをするための土台となります。