Python などのモダンなプログラミング言語では、コンピュータが扱う全てのデータをオブジェクト(またはインスタンス)と呼ぶ。数値や文字列はもちろん、画像や音声データ、そしてプログラムもオブジェクトだ。
オブジェクトの設計図(定義)をクラスと呼ぶ。クラスの中ではオブジェクトを操作するメソッドを定義する。そして、クラスを設計してオブジェクトを処理するプログラミング手法をオブジェクト指向プログラミングと呼ぶ。
今回は、Python のデータ型がクラスであり、データの実体がオブジェクトになっていることを学ぶ。
今回は、Python のデータ型がクラスであり、データの実体がオブジェクトになっていることを学ぶ。
サンプル・プログラム
データ型とクラス
たとえば、整数型(int)の定義は、0,1,2‥‥9の数字と+, -符合から成る一連のデータといえる。これに2進数/8進数/16進数表記と指数表記の定義が加えると、整数型のクラスということになる。
Python の場合、これまで紹介してきたように、ユーザーが新たなクラスを記述しなくても目的を達成するプログラムを書くことができるのだが、じつは、整数型や文字列型をはじめ、すべてのデータ型は、あらかじめクラスとして用意されたものである。「3.9 基本データ型と型変換」でみた type関数の出力からも、そのことが分かる。
type関数の出力を振り返ってみよう。"type1.py" を実行してみてほしい。
Python の場合、これまで紹介してきたように、ユーザーが新たなクラスを記述しなくても目的を達成するプログラムを書くことができるのだが、じつは、整数型や文字列型をはじめ、すべてのデータ型は、あらかじめクラスとして用意されたものである。「3.9 基本データ型と型変換」でみた type関数の出力からも、そのことが分かる。
type関数の出力を振り返ってみよう。"type1.py" を実行してみてほしい。
# int型
a = 1
print(f"{a} ... {type(a)}")
# float型
b = 3.14
print(f"{b} ... {type(b)}")
# complex型
c = 1 + 2j
print(f"{c} ... {type(c)}")
# bool型
d = 1 == 1
print(f"{d} ... {type(d)}")
# strt型
e = "ぱふぅ家"
print(f"{e} ... {type(e)}")
# list型
f = [ 1, 2, 3, 4, 5 ]
print(f"{f} ... {type(f)}")
すべてのデータ型について class であることを表示する。
そして、たとえばint型の場合、数字の実体である1, 2, 3‥‥をオブジェクトと呼ぶ。
そして、たとえばint型の場合、数字の実体である1, 2, 3‥‥をオブジェクトと呼ぶ。
メソッド
次に、文字列型(strクラス)を詳しく見てみよう。
一般的に、クラスには、それを操作するためのメソッドという関数のような仕組みが備わっている。クラス名(またはオブジェクト名).メソッド名(引数) のように、クラス名(またはオブジェクト名)のメソッド名の間にドット . を挟んで使う。関数と同じで引数がないメソッドもあるが、そのときでも括弧 () は省略できない。
一般的に、クラスには、それを操作するためのメソッドという関数のような仕組みが備わっている。クラス名(またはオブジェクト名).メソッド名(引数) のように、クラス名(またはオブジェクト名)のメソッド名の間にドット . を挟んで使う。関数と同じで引数がないメソッドもあるが、そのときでも括弧 () は省略できない。
# split -- 区切り文字による分割
str1 = "name,2,3.14"
list1 = str1.split(",")
print(f"{str1} => {str(list1)}")
# isdigit -- 整数かどうか
for s in list1:
if s.isdigit():
print(f"{s} は整数だ.")
else:
print(f"{s} は整数ではない.")
# len(文字列)
str1 = "あいうえお"
print(f"len(\"{str1}\") = {len(str1)}")
print(f"\"{str1}\".__len__()) = {str1.__len__()}")
次に、組み込み関数を見てみよう。プログラム "len1.py" を実行してみてほしい。
len関数は文字列の長さを返す組み込み関数だが、じつは、strクラス(str型)のメソッド str.__len__() を呼び出している。
len関数は文字列の長さを返す組み込み関数だが、じつは、strクラス(str型)のメソッド str.__len__() を呼び出している。
# len(文字列)
str1 = "あいうえお"
print(f"len(\"{str1}\") = {len(str1)}")
print(f"\"{str1}\".__len__()) = {str1.__len__()}")
len関数はリストの要素の数を返すことも出来るが、このときはlistクラス(list型)のメソッド list.__len__() を呼び出している。
このようにメソッドに別の名前を与えることをラッピングまたはラッパーと呼ぶ。Python では、len関数のように巧みにラッピングが行われており、FORTRANやCのようなオールドスタイルのプログラミングもできるし、モダンなオブジェクト指向プログラミングもできるようになっている。
このようにメソッドに別の名前を与えることをラッピングまたはラッパーと呼ぶ。Python では、len関数のように巧みにラッピングが行われており、FORTRANやCのようなオールドスタイルのプログラミングもできるし、モダンなオブジェクト指向プログラミングもできるようになっている。
練習問題
次回予告
現実世界や架空世界をコンピュータの中に忠実に再現するために、Python ではユーザーがクラスを定義することができる。ユーザー定義クラスを大別すると、面積や体積といった公式をクラス化する場合と、オブジェクトを造るための設計書としてのクラスの2つに分かれる。
コラム:Smalltalkのオブジェクト指向
オブジェクト指向型プログラミング言語は、1970年代にゼロックス・パロアルト研究所(PARC)で開発された Smalltalkを共通の始祖にもつ。開発を主導してきたコンピュータ科学者のアラン・ケイは、シミュレーション用プログラミング言語 Simulaの影響を受け、Smalltalkに豊富で洗練されたクラスライブラリを用意し、メッセージングのためのユーザーインターフェースとしてマルチウィンドウを開発した。
だが、黎明期にあったパソコンにマルチウィンドウを搭載することは難しく、プログラマの関心はクラスやインスタンスに向かった。これは、その後に登場するプログラミング言語 C++に影響を与えることになる。
だが、黎明期にあったパソコンにマルチウィンドウを搭載することは難しく、プログラマの関心はクラスやインスタンスに向かった。これは、その後に登場するプログラミング言語 C++に影響を与えることになる。
一方、Smalltalkのマルチウィンドウは、リアル世界の「紙」が重なるから同じように重ね合わせている事を見抜いたアップルのスティーブ・ジョブズは、1984年(昭和59年)に Macintoshを販売する。翌年に登場する Microsoft Windows 1.0はウィンドウを重ね合わせることができなかったが、Macintoshは最初から重ね合わせることができた。(1987年発売の Microsoft Windows 2.0で重ね合わせる事ができるようになった)
本文でも紹介したように、オブジェクト指向は、現実世界をコンピュータの中に忠実に再現するために考え出された概念であり、マルチウィンドウもその1つの手段であった。
Smalltalkから半世紀を経た現在、スマホのウィンドウはマルチウィンドウとは違う方向へ進化している。もしかすると、スマホという仮想世界が主となり、現実世界の方が従となっていくのかもしれない。
本文でも紹介したように、オブジェクト指向は、現実世界をコンピュータの中に忠実に再現するために考え出された概念であり、マルチウィンドウもその1つの手段であった。
Smalltalkから半世紀を経た現在、スマホのウィンドウはマルチウィンドウとは違う方向へ進化している。もしかすると、スマホという仮想世界が主となり、現実世界の方が従となっていくのかもしれない。
(この項おわり)