公開Pythonチートシート:[Pythonチートシート]クラス定義編クラスの定義の基本からさまざまな属性の定義、クラスの継承や多重継承まで、クラスに関わるさまざまな構文をギュッとまとめた。});この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。今回はクラスの定義の基本構文、クラス変数/クラスメソッド/スタティックメソッドの定義、プライベートな属性、プロパティ、クラスの継承、多重継承の構文をまとめる。多重継承なお、クラス定義にまつわる詳細については「Python入門」の以下の記事などを参照されたい。mixinクラス定義の基本クラス定義の基本を以下に示す。パラメーターリスト):インスタンスメソッドのコードクラス定義の基本構文このようにして定義したクラスはobjectクラスの派生クラスとなる。__init__メソッドは、そのクラスのインスタンス(オブジェクト)を定義する際に、インスタンスが持つ属性(インスタンス変数)の初期化などを行うために使用する。インスタンスメソッドは、インスタンスを介して呼び出し可能な操作である。これらのメソッドの定義では第1パラメーターには暗黙の「self」を置く(selfには初期化を行う対象となるインスタンス、またはメソッド呼び出しに使われたインスタンスが渡される)。メソッド内でインスタンスの属性にアクセスする際には「self.属性」の形でアクセスする。(一般には)メソッドを呼び出す際にはselfには引数の形で値を与えることはない。クラスを定義すると、「クラスオブジェクト」が作成される。そのクラスのインスタンスを定義するにはクラス名にかっこ「()」を付加して呼び出しを行う(クラスオブジェクトは「呼び出し可能なオブジェクト」であり、かっこを付加することで呼び出し可能。この結果、__init__メソッドが呼び出されて、インスタンスの初期化が行われる)。以下にクラス定義の例を示す。Trueクラス定義の例クラス変数/クラスメソッド/スタティックメソッドを持つクラスPythonのクラスでは、インスタンス変数/インスタンスメソッド以外に以下を属性として持たせることができる。クラス変数クラスメソッドスタティックメソッドインスタンス変数とクラス変数の違いを以下の表に示す。self.クラス変数(値の書き換えに注意)クラス.クラス変数self.__class__.クラス変数type(self).クラス変数インスタンス変数とクラス変数クラス変数はクラスが持つ変数で、その値は全てのインスタンスで共有される。初期値」として定義できる。クラス変数には「クラス.クラス変数」「インスタンス.クラス変数」などとしてアクセスできる。......」として代入を行うと、クラス変数ではなく、インスタンス内にクラス変数と同じ名前のインスタンス変数が定義されるので注意が必要だ。インスタンスメソッド、クラスメソッド、スタティックメソッドの違いを以下に示す。クラス.スタティックメソッド(引数)インスタンス.スタティックメソッド(引数)インスタンスメソッド/クラスメソッド/スタティックメソッドクラスメソッドは、クラスに結び付けられたメソッドで、呼び出しには「クラス名.クラスメソッド名()」あるいは「インスタンス変数.クラスメソッド名()」の構文を使う。クラスメソッドの定義では第1パラメーターには(暗黙の)「cls」を置く(clsにはクラス自体が渡される)。インスタンス変数の属性にはアクセスできず、クラス自身を介した何らかの操作を行いたいときに定義する。クラスメソッドの定義では、一般にメソッド定義を「@classmethod」デコレーターで修飾する。スタティックメソッドは、インスタンスともクラスとも結び付いていないメソッド。スタティックメソッドは「クラスを名前空間として、そこで定義された関数(メソッド)」と考えられる。その呼び出しは「クラス名.スタティックメソッド名()」または「インスタンス変数.スタティックメソッド名()」という形式で行う。インスタンスメソッドやクラスメソッドとは異なり、メソッド定義では暗黙の第1パラメーターを持たない。スタティックメソッドの定義では、一般にメソッド定義を「@staticmethod」デコレーターで修飾する。これらをまとめると次のようになる。Foo.clsvar)クラス変数、クラスメソッド、スタティックメソッドを含んだクラス定義の例この例では、instance_methodメソッドではクラス変数の値を読み取るのに「self.clsvar」としている。1」としてクラス変数の値を変更している。cls_methodメソッドでは「cls.clsvar」としてクラス変数にアクセスしている。これによりクラス変数にアクセスできる。クラスメソッドは特定のインスタンスとは関連付けられておらず、暗黙の第1パラメーターclsにはクラス自体が渡される。static_methodメソッドは暗黙の第1パラメーターに特定のインスタンスやクラスが渡されることはないので、その内部でクラス変数にアクセスするには「クラス名.クラス変数名」とするしかない。そのため、上の例では「Foo.clsvar」としてアクセスをしている。1」としているが、これによりインスタンスbに「clsvar」という「インスタンス変数」が作成されてしまう。そのため、「b.clsvar」と「Foo.clsvar」ではその値が異なるようになる(興味のある方はコードを実行して確認してほしい)。外部に公開したくない属性(インスタンス変数、メソッド)をクラスが持つ場合、それらの名前はアンダースコア「_」で始めるようにする。これはその属性が「プライベート」であることを意味する命名規約であり、それを使わないようにすることはあくまでも「紳士協定」である。最後の行で「f._name」としているように、アンダースコア「_」で始まる属性にも直接アクセス可能である。2つのアンダースコア「__」で始めることで、さらに強い効力を持たせることもできる。2つのアンダースコアで属性の名前を始めると、その名前で直接その属性にアクセスできなくなる(「_クラス名__属性名」のように名前がされる。これを「名前マングリング」あるいは単に「マングリング」と呼ぶ)。AttributeError例外アンダースコア2つで始めるより強制度の高いプライベートな属性の例この場合も、「f._Foo__name」とすれば、クラス内部で「__name」として定義されているインスタンス変数にアクセスは可能だが、以前のように「__name」で外部からはアクセスできなくなる。プロパティプライベートな属性と、それらにアクセスするためのメソッド(インタフェース)を用意することはよくある。それらは上のような方法でも実現可能だが、Pythonでは「プロパティ」と呼ばれる機構を用いて、これを実現できる。プロパティを設定するには組み込みのproperty関数を使用するか、@propertyデコレーター(セッタ、ゲッタなどのデコレーター指定)を使用する。property関数の構文を以下に示す。doc=None)property関数fgetにはプロパティの値を読み出すためのメソッドを、fsetにはプロパティの値を設定するためのメソッドを、fdelにはプロパティの値を削除するためのメソッドを、docにはプロパティのヘルプ文字列(docstring)を指定する。TypeError例外property関数の使用例この例では、__init__メソッドでプライベートなインスタンス変数__nameの値を初期化して、その後はget_propメソッドとset_propメソッドを介して、その値をやりとりするようなコードになっている。クラス定義の最後ではproperty関数を使用して、プロパティの値の読み取りはget_propメソッドで行い、書き込みはset_propメソッドで行うように指定し、その戻り値をname属性に代入している。これにより、「インスタンス変数nameを使ってその値を読み書きする」体裁で、これらのメソッドを使った値の読み書きを行えるようになる。@propertyデコレーターを使用する例を以下に示す。TypeError例外@propertyデコレーターの使用例@propertyデコレーターを使用する場合には、@propertyデコレーターで修飾したメソッドが値を読み取るために使われる(ゲッタ)。そのメソッドと同じ名前のメソッドを定義して、「@メソッド名.setter」デコレーター(この場合は「@name.setter」デコレーターとなる)で修飾することで、それがプロパティの値を設定するために使われる(セッタ)。「@メソッド名.deleter」デコレーターで修飾したメソッドがあれば、それはプロパティの値を削除するために使われる。設定を有効にする必要があります。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。