#
7 クラス定義

クラス定義は、クラスオブジェクトを定義します ( 3.2 節参照):

  classdef | ::= | "class" classname [inheritance] ":" suite
  inheritance | ::= | "(" [expression_list] ")"
  classname | ::= | identifier

  Download entire grammar as text.

クラス定義は実行可能な文です。クラス定義では、まず継承リストがあれば それを評価します。継承リストの各要素の値評価結果はクラスオブジェクトか、 サブクラス可能なクラス型でなければなりません。 次にクラスのスイートが新たな実行フレーム内で、 新たなローカル名前空間と元々のグローバル名前空間を使って実行されます ( 4.1 節を参照してください)。 (通常、スイートには関数定義のみが含まれます) クラスのスイートを 実行し終えると、実行フレームは無視されますが、ローカルな 名前空間は保存されます。次に、基底クラスの継承リストを使って クラスオブジェクトが生成され、ローカルな名前空間を属性値辞書 として保存します。最後に、もとのローカルな名前空間において、クラス名が このクラスオブジェクトに束縛されます。

プログラマのための注釈: クラス定義内で定義された変数は クラス変数です; クラス変数は全てのインスタンス間で共有されます。 インスタンス変数を定義するには、`__init__()` メソッドや 他のメソッド中で変数に値を与えます。クラス変数もインスタンス変数も ```self.name`'' 表記でアクセスすることができます。この表記で アクセスする場合、インスタンス変数は同名のクラス変数を隠蔽します。 変更不能な値をもつクラス変数は、インスタンス変数のデフォルト値と して使えます。 新スタイルクラスでは、デスクリプタを使ってインスタンス変数の振舞い を変更できます。