9.クラス
クラスは、データと機能を組み合わせる方法を提供し、オブジェクト指向プログラミングの基盤となる概念です。
新しいクラスを作成することで、独自の型を定義し、その型に基づいたインスタンスを生成できます。これにより、各インスタンスは自分自身の状態を保持し、その状態を操作するメソッドを持つことが可能になります。
9.1 名前とオブジェクト
Pythonにおけるオブジェクトには「個体性」があります。
つまり、同じオブジェクトに対して複数の名前を割り当てることができます。
この概念は「別名付け(aliasing)」として知られています。
Pythonでは、特にリストや辞書などの変更可能な型で、この別名付けが重要な役割を果たします。
9.2 Python のスコープと名前空間
クラスの動作を理解するためには、Pythonのスコープと名前空間のルールを知る必要があります。
名前空間: 名前からオブジェクトへの対応付けのこと。Pythonでは通常、名前空間は辞書として実装されます。
スコープ: プログラムのテキスト上で、特定の名前空間にアクセスできる範囲を指します。
Pythonでは、スコープは静的に決定され、動的に使用されます。つまり、プログラムの実行中には、常に入れ子になったスコープの中から最も内側のスコープから順に検索が行われます。
def scope_test():
def do_local():
spam = "local spam"
def do_nonlocal():
nonlocal spam
spam = "nonlocal spam"
def do_global():
global spam
spam = "global spam"
spam = "test spam"
do_local()
print("After local assignment:", spam)
do_nonlocal()
print("After nonlocal assignment:", spam)
do_global()
print("After global assignment:", spam)
scope_test()
print("In global scope:", spam)
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
このように、do_local()ではローカルスコープ内でのみ変数spamが変更され、do_nonlocal()では外側のスコープの変数が変更されます。そして、do_global()ではグローバルスコープの変数spamが変更されます。
9.3 クラス初見
Pythonのクラス定義は、他の多くの言語と同様にclassキーワードを使用して行います。クラスは、関連するデータとメソッドをまとめた一種のテンプレートであり、それを使って新しいオブジェクトを生成します。
class ClassName:
<statement-1>
.
.
.
<statement-N>
クラス定義を実行すると、新しい名前空間が作成され、そこにクラスの属性やメソッドが格納されます。クラス定義が終了すると、クラスオブジェクトが生成され、定義された名前で結びつけられます。
9.3.1 クラスオブジェクト
クラスオブジェクトは、属性参照とインスタンス生成の2つの主要な操作をサポートしています。
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'
上記のクラスでは、MyClass.iは整数、MyClass.fは関数オブジェクトを返します。また、クラスのインスタンス化は以下のように行います。
x = MyClass()
クラスに__init__()メソッドが定義されている場合、インスタンス生成時にこのメソッドが自動的に呼び出され、オブジェクトを初期化することができます。
class Complex:
def __init__(self, realpart, imagpart):
self.r = realpart
self.i = imagpart
x = Complex(3.0, -4.5)
このように、init()メソッドを使って、インスタンスを初期化し、特定の属性を設定することができます。
9.3.2 インスタンスオブジェクト
クラスのインスタンスは、データ属性とメソッドという2種類の属性を持つことができます。データ属性は、クラス内で宣言する必要はなく、インスタンス生成後に動的に追加することが可能です。
x.counter = 1
while x.counter < 10:
x.counter = x.counter * 2
print(x.counter)
メソッドは、インスタンスオブジェクトに属する関数であり、インスタンス固有のデータにアクセスして操作するために使用されます。
Pythonのクラスとインスタンスは、非常に柔軟であり、動的に属性やメソッドを追加、削除することができます。
また、オブジェクト指向プログラミングの基本的な機能を全てサポートしており、複数の基底クラスを持つことができるなど、高度な継承機能も備えています。