見出し画像

Python言語によるプログラミングイントロダクション(8)

 Python言語によるプログラミングイントロダクション第2版ーデータサイエンスとアプリケーション(著者:Jhon V. Guttag 監訳:久保幹雄)を読んだ学習を記録していきます。そのため、詳しい内容を学習したい場合は本を購入していただくことをお勧めいたします。また、解釈や理解が間違えである場合も多々あるかと思います、、、

第8章 クラスとオブジェクト指向プログラミング(p105~129)

 クラスは様々な用途で使用できるが、オブジェクト指向プログラミングに即したクラスの仕様について重点をおく。オブジェクト指向プログラミングの要点は、オブジェクトをデータとそれを操作するメソッドからなる集合体として捉えることである。

8.1 抽象データ型とクラス
 抽象データ型とは、オブジェクトとそれに対する処理操作をひとまとまりにしたものである。オブジェクトとそれに対する処理操作を結びつけることで、プログラム内で自在にオブジェクトを受け渡し可能になる。つまりは、オブジェクトが持つデータ属性へのアクセスのみならず、データ処理操作へのアクセスも用意になる。
 データ処理操作の使用が決まれば、抽象データ型と、それを利用するプログラミングとの間のインターフェースが決まる。インタフェースとは、データ処理操作の振る舞いの定義をするものになる。
 クラス定義はtype型のオブジェクトを作成し、それとinstancemethod型の一連のオブジェクトとを関連付ける。メソッドとはクラス定義の中で関数定義されているものである。
 インスタンス化とは、クラスのインスタンスを生成することである。例えば、s = IntSet()IntSet型の新たなオブジェクトを生成する。このオブジェクトをIntSet型のインスタンスと呼ばれる。
 属性参照とは、ドッド表記を用いて、クラスに関連づけられた属性にアクセスすることである。例えば、s.memberのようなものである。

# 一般的なクラスの定義
class class(object):
    """クラスにより与えられるデータの抽象化について"""
    #実装に関する情報 
    
    def __init__(self):
        """仕様"""
        処理
    
    def 関数名(self, 引数):
        """仕様"""
        処理

 Pythonには"__"で挟まれた多くの特殊なメソッドが存在する。__init__ではクラスがインスタンス化される度に呼び出されるメソッドである。また、"__"で挟まれていないメソッドは上で示したように、ドットで呼び出すことができる。その際に、必要な引数はself以外に引数を定義するだけで良い。これは、ドット記法をすることで暗黙のうちにメソッド呼び出しの第1引数にドットの直前の式に関連付けされたオブジェクトが渡される。selfを第1引数に使うのはPythonの慣例である。
 クラスと関連づけられたデータ属性をクラス変数と呼ぶ。また、インスタンスに関連づけられたデータ属性をインスタンス変数と呼ぶ。
 プログラミングをする中で抽象化をすることは極めて重要であり、丁寧に練られたプログラミングは何年も繰り返し利用可能なプログラミングとして世に残されていく。

8.2 継承
 親クラスのメソッドなどを利用することができることを継承と呼ぶ。最上位に位置するものはobjectクラスであり、故にクラス定義をする際にインスタンス化などをすることができる。オブジェクト指向での言い方をすると、サブクラスはスーパークラスの属性を継承する。また、継承は段階的に継承していくことができ、多重継承と呼ばれる。サブクラスは、親クラスを拡張した定義のものになるべきである。

8.3 カプセル化と情報隠蔽
 カプセル化とは、データ属性とそれを操作するメソッドをまとめて扱うことを意味する。情報隠蔽とは、クラスの中の処理に外部からアクセスすることを不可能にすることである。"__"で挟むのではなく関数の前に記すことで情報隠蔽をすることができる。しかし、情報隠蔽をすることで処理をする際に、直接的にデータを処理できなくなり、処理速度が遅くなることがある。これを解決するために、ジェネレータと言うものがある。for文と組み合わして、yield文を利用することで反復処理などを効率化することができる。しかし、ジェネレータの詳しい説明については難しいようなので、今後の課題として残しておく。

重要語句
クラス、オブジェクト指向、メソッド、抽象データ型、データ属性、インタフェース、メソッド、インスタンス、属性参照、クラス変数、インスタンス変数、表現不変量、多重定義、継承、親クラス、スーパークラス、サブクラス、オーバーライド、ジェネレータ

この記事が気に入ったらサポートをしてみませんか?