Python入門(3.オブジェクト指向)です。
Python[完全]入門を参考に執筆しました。
Pythonでいうオブジェクト指向は、オブジェクトを「自分自身」とし、メソッドを「自分自身を対象とする関数」とする。
どんなメソッドを使うのであっても、そのメソッドは自分自身に対して行われる。
後日注記:Pythonでは、データ(変数)とメソッド(関数)をひとつの関連するモジュールにまとめて、クラスにコード(たい焼きで言えば金型)を記述し、そのクラスをインスタンス(たい焼きで言えばひとつひとつのたい焼き)にして扱う。これをオブジェクト指向と呼ぶ。また、Pythonではクラスの中のデータとメソッドをアトリビュート(属性)と呼ぶ。
オブジェクト指向も参照のこと。
こんな感じになる。
# クラス名は大文字で始める。 class Text: # コンストラクタ。クラスからインスタンスを作り出した時に実行される。 # 最初の引数selfは特別な引数で、オブジェクト自身を表す。 # 実際の引数は2番目から使われる。 def __init__(self, content): # メンバ変数はself.変数名となる。 # このクラス(ここではText)の全てのメソッドから、 # 同じメンバ変数(ここではself.buff)にアクセスできる。 self.buff = content def add(self, content): self.buff = self.buff + content # Textを継承したPrintableTextを定義する。 class PrintableText(Text): def print_text(self): print(self.buff) # インスタンスの作成。それぞれが異なるデータを保持する。 text1 = PrintableText("hoge") text2 = PrintableText("foo") text2.add("bar") text1.print_text() text2.print_text()
まず、import文でモジュールを読み込む。
import モジュール名
その後にモジュール名.クラス名()のようにクラスのオブジェクトを作成する。
モジュール名をいちいち明記したくない時は、
from モジュール名 import クラス名
のようにfrom ~ import文を使う。
あるいは、
from モジュール名 import *
としてもよい。
以下はクラスについてのキーワード。
キーワード | 説明 |
---|---|
class クラス名: | クラスの定義 |
def メソッド名(引数): | メソッドの定義 |
__init__ | コンストラクタ。 インスタンスが作成された時に実行される。 |
__del__ | デストラクタ。 インスタンスが破棄された時に実行される。 |
self | メソッドの第一引数に指定する。 selfはそれぞれのインスタンスを意味する。 Java/C++のthisのようなもの。 メソッドの第一引数は必ずselfとなる。 |
メソッドの第二引数以降 (self以降の引数) | メソッドの第二引数から、通常の関数に与えるものと同じ引数を与える。 メソッドを呼び出す時は、第二引数以降を引数として渡す。 メソッドを呼び出す際にselfは引数として指定しない。 selfだけの引数を持ったメソッドは引数なしのメソッドとして呼び出す。 |
self.属性 | インスタンスの属性を表す。 クラスの内部(メソッド間)で共有される変数として利用できる。 インスタンスが作成されてから破棄されるまで保持される。 たとえばself.hogeとなる。 |
from ... import | モジュールをインポートする。 クラスは通常モジュールに保管し、インポートして利用する。 |
クラス名() | インスタンスを作成する。newは必要ない。 |
インスタンス名.メソッド名() | インスタンスに対してメソッドを呼び出す。 たとえばobj.hoge()となる。 |
たとえば以下のようになる。
class Cat: def __init__(self, name, food, mew): self.name = name self.food = food self.mew = mew def intro(self): print('僕の名前は{0}だ。好きな食べ物は{1}。'.format(self.name, self.food)) print(self.mew)
上の内容をcat.pyに保存して次のようにインポートする。
from cat import Cat kuro = Cat('クロ', 'たこ焼き', 'にゃーご。') shiro = Cat('シロ', 'チーズ', 'ごろごろにゃーん。') kuro.intro() shiro.intro()
継承は
class ExCat(Cat):
などのようにクラス名 (親クラス名)と指定する。
後日注記:継承はプログラムコードの再利用性を高める。最初のうちは「なんのためにあるのか分からない」というオブジェクト指向だが、たくさんのコードを複数の人間が書くようになった時に、はじめて「オブジェクト指向で設計していてよかった」という悟りを得ることができる。
後日注記:派生クラスから基底クラスのメソッドを実行するにはsuper()関数を使う。
関数 | 説明 |
---|---|
object() | もっとも基本的なobjectクラスのオブジェクトを作成できる。 |
id() | オブジェクトの識別子であるIDを返す。 |
hash() | オブジェクトのハッシュ値を返す。 |
type() | オブジェクトの型を調べることができる。 |
isinstance() | オブジェクトがクラスのインスタンスであるかどうかを調べられる。 |
issubclass() | クラスが派生クラスであるかどうかを調べられる。 |
詳しくは以下の書籍が参考になる。
Pythonの標準ライブラリには、さまざまなモジュールが用意されている。
Pythonプログラムを書く上で、必ずしも自分で同じものを作らなくても、多くの機能が標準ライブラリにモジュールとして用意されているため、上手く使えば「三分ハッキング」のように簡単にプログラミングを行える。本当に三分でできるかは別として。
オブジェクト指向が「これだけでは分からない」という方向けに、以下の記事がおすすめです。
Pythonの特徴として言えるのは、極めて英語のように書けるということです。
Pythonでは、まず、クラスのオブジェクトを書き、次にメソッドを書き、その次にメソッドに与える引数を書きます。
英語を知っている人なら誰でも分かる通り、英語と同じです。まず主語、次に述語(動詞)、そして次に目的語を書きます。
目的語は、複数取ることができます。英語を知っている人なら、間接目的語の後に直接目的語を渡したいでしょう。Pythonのメソッド定義でクラスのインスタンスとしてselfをほかの引数よりも前に置くのは、そういう理由が少しばかり見え隠れすると思います。
Pythonは極めて高水準な言語です。Lispには負けますが、Lispと同じぐらいの抽象性があります。大学でも最近はPythonを中心に教えます。まさに現代的言語として、Pythonは完成されたと言えます。
2024.08.15
状態を参照のこと。
インターフェースを参照のこと。