Python のオブジェクトとクラス


こんにちは、切口太郎です。

今回は、オブジェクトとクラスについてお話します。

オブジェクト指向言語では、クラスは定義、オブジェクトは実体の事です。
クラスをインスタンス化するとオブジェクトになります。

言語によって若干違いますが、基本的にこのような説明が多いと思います。

さて、この説明で、「わかっちゃ!」となりますか?

今回は、「わかんねぇー」という人の為のお話です。
実は、なんとなくわかっているつもりだけど、よくわかんねー 人もよろしければ、この先も読んで下さい。

「すげーわかってる。この文章は正確ではないね。正確には・・・・うんぬん・・・・かんぬん」 という方はスコープ外です。


では、始めましょう!

1 オブジェクトとクラス


オブジェクト指向でクラスとオブジェクトは、本が一冊でるぐらいの内容ですので、詳しい人の方が少ないぐらいです。
エッセンスに絞ってを重点的にお話します。

さきほどのオブジェクトの説明は、図にするとこのようになります。



Python でクラス定義されたクラスをインスタンス化すると、オブジェクトになります。オブジェクトには名前がつけられます(この図ではA)

1つのクラスで複数のオブジェクトを作成することもできます。
オブジェクトは、すべてクラスで定義している値、メソッドを持ちます。




ここまでは、クラスとオブジェクトの関係です。

2 Python では、すべてがオブジェクトとして扱います


数値、文字列、リスト、タプル、集合、辞書、関数、クラス... すべてがオブジェクトとして扱えます。
オブジェクトとして扱うには、クラスをインスタンス化する必要があります。
つまり、数値、文字列、リスト・・・・は、すべてクラスをインスタンス化しているものです。

文字列を例にお話します。

>>> name=str("kirikutitarou")
>>> print(name)
kirikutitarou
>>> name.find("tarou")
8

文字列は、str クラスで定義しています。
name = str("Kirikutitarou") で、インスタンス化して、オブジェクトの名前を name に設定しています。

str クラスには、find という文字列を探すメソッドが定義されているので、name.find("tarou") で "tarou" の文字列が name にあるか検索できます。
実行すると、文字列の8番目にあると結果が返ってきます。

Pythonでは、 明示的にインスタンスを行わなくても、暗黙的にインスタンス処理を実行します。

>>> name="kirikutitarou"
>>> print(name)
kirikutitarou
>>> name.find("tarou")
8

name="kirikutitarou" は、name=str("kirikutitarou") と同じ動作をします。

これが、「Python では、すべてがオブジェクトとして扱います」の仕掛けです。

3 クラス


では、クラスとは何でしょうか?

python で、class 宣言することで作成します。

クラスには、クラス内部のみ有効な変数とメソッドを記述します。

import sys

# クラスの定義
class Cls:
    def getPath(self):
        return sys.base_exec_prefix
# 親クラスを継承したクラスの定義   
class ChildCls(Cls):
    def getPythoPath(self):
         return sys.platform + ' ' + super().get_python_path()

A = Cls()                # インスタンス化
B = ChildCls()         # インスタンス化

クラスのインスタンス化は、A = Cls() で行います。
これは、さきほどの文字列の例 name=str("kirikutitarou") と同じです。


4 クラスの継承


Python のクラスは、「継承」という概念があります。

継承とは、親クラスの性質を引き継ぐことで、子クラスは、親クラスの機能を持ちます。
ChildClsは、Cls を親クラスにしています。


継承すると、子クラスは親クラスの機能を持つというのは、上記の図で説明します。

Class Cls には、getPath() メソッドがあります。 Cls をインスタンス化して、A のオブジェクトを作ると、このオブジェクトは A.getPath() メソッドが利用できます。

Class ChildCls には、getPythonPath()メソッドがあります。
ChildCls をインスタンス化して、Bのオブジェクトを作ると、このオブジェクトは、Cls のメソッド と ChildCls のメソッドの両方のメソッドが利用できます。


オブジェクト指向言語で、何が便利と言えばこの継承機能です。

始めに、基本的な機能を持つクラスを作成して、順次、高度な機能を持つクラスを作成し基本的なクラスを作ることにより、どんどん高機能なモデルを作成できます。
このような方法は、プロトタイピング手法で利用されています。


5 クラスの派生



このように、クラスを継承して、新しいクラスを作る方法を「派生」と呼んでいます。
一番上の Basic クラスは、ずべてのクラスの親クラスなので「基底クラス」と呼びます。

業務で開発する場合には、上のようなクラス図を作って、下のようなクラスの内容を定義する表を作ります。

クラス名
親クラス
機能
Basic
基底クラス
データサーバー通信を行う
Custom
Basic
認証サーバー通信を行う
Company1
Custom
顧客1のユーザー認証を行う
Company2
Custom
顧客2のユーザー認証を行う
AppOut
Basic
アプリケーション出力用
AppIn
Basic
アプリケーション入力用

こうすることにより、Basic クラスを先に作ってしまえば、その他のクラスは分担して開発ができるので、開発速度が上がります。

Python に限定した内容なのでしたが、どうでしょう?
オブジェクトとクラスについて、少しでも理解の助けになったら嬉しいです。







コメント

このブログの人気の投稿

Hyper-V で Docker Desktop for Windows を使う(その2)

VS Code で Hyper-V + Docker Desktop for Windows