Select Language

AI Technology Community

7.1、Pythonクラスの定義と使用

クラスの最も基本的な機能は、新しい型を定義することです。次の構文を使用して、何の属性も持たず、何もできない空のクラスを定義することができます。

class クラス名:
    pass

ここでのクラス名は、変数名と同じ規則で、アルファベット、数字、アンダースコアで構成でき、通常は最初の文字が大文字のアルファベットで、長さに制限はありません。

クラスを定義した後、そのクラスを使用してインスタンスを作成することができます。方法は次の通りです。

インスタンスオブジェクト名 = クラス名()

次に、クラス Student を定義し、このクラスを使用してインスタンスオブジェクト student_a を作成します。ここでは Python 2 を使用しています。

>>> class Student:             # クラスStudentを定義
...     pass
...                            # クラス定義終了
>>> student_a = Student()      # このクラスを使用してオブジェクトstudent_aを作成
>>> student_a                                  # オブジェクトstudent_aを確認
<__main__.Student instance at 0x10e7c8b00>     # このオブジェクトが所属するクラスとid
>>> type(student_a)            # 型を確認
<type 'instance'>
>>> dir(student_a)             # このオブジェクトが持つ属性を確認
['__doc__', '__module__']

Python 3 では、出力結果に大きな違いがあります。例えば、type(オブジェクト)はそのクラスの属性を返します。次は Python 3 で同じコードを実行した出力結果です。

>>> class Student:             # クラスStudentを定義
...     pass
...                            # クラス定義終了
>>> student_a = Student()      # このクラスを使用してオブジェクトstudent_aを作成
>>> student_a                  # オブジェクトstudent_aを確認
<__main__.Student object at 0x106dd3160>
>>> type(student_a)            # 型を確認、Python 2と異なる
<class '__main__.Student'>
>>> dir(student_a)             # このオブジェクトが持つ属性を確認、Python 2と異なる
['__class__', '__delattr__', '__dict__', '__dir__',
'__doc__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__gt__', '__hash__', '__init__',
'__init_subclass__', '__le__', '__lt__', '__module__',
'__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', '__weakref__']


前の例から、クラスとインスタンスオブジェクトという2つの概念を知ることができます。整数型などの予め定義された型の場合、次の方法でインスタンスオブジェクトを作成することができます。

int_obj_a = int(12)

ここでのクラスは int で、インスタンスオブジェクトは int_obj_a です。予め定義されたクラス int に基づくインスタンスオブジェクトを作成することも、独自に定義したクラス Student に基づくインスタンスオブジェクト student_a を作成することもできます。

このように考えると、これまで見てきた整数、文字列、リストは、実は特殊な予め定義されたクラスです。では、独自に定義したクラスも type() や id() などの関数を使用できるでしょうか?答えはできます。そして、Python 3 では基本的に違いはありません。

>>> type(student_a) == Student         # type()関数の使い方
True
>>> isinstance(student_a, Student)     # isinstance()関数の使い方
True
>>> id(student_a)                      # id()関数の使い方
4410126688


ただし、Python 2 では type() 関数を使用できないため、isinstance() の使用をおすすめします。これにより、コードは Python 2 と Python 3 の両方で予想通りに動作します。次は Python 2 の場合です。

>>> student_a = Student()              # オブジェクトを作成
>>> type(student_a) == Student         # type()関数の使い方、問題あり
False
>>> isinstance(student_a, Student)     # isinstance()関数の使い方
True
>>> id(student_a)                      # id()関数の使い方
4331899648


post
  • 10

    item of content
前の章では、リストや辞書などのPythonの予め定義されたデータ型について説明しました。しかし、自分で新しいタイプを定義したい場合、クラスを使用する必要があります。つまり、クラスを使用することで自分だけのデータ型を定義でき、システムで定義された型だけを使う以上のことができます。
クラスはオブジェクト指向プログラミングにおいて非常に基本的な概念であり、最も基本的な機能は新しいデータ型を作成することです。さらに、クラスAから新しいクラスBを派生させることができ、その際クラスBはクラスAのすべての属性を継承します(これを継承機能と呼びます)。
この章では、クラスの定義と使用方法について説明します。具体的には、クラスのプロパティとメソッド、クラスの派生方法、多重継承の使用方法などを解説します。