投稿日: | 最終更新日:
Pythonのクラスとインスタンス
Pythonのクラスとインスタンスの基本的な使い方を調べてみます。
オブジェクト指向プログラミング
Pythonは、最初のオブジェクト指向スクリプト言語です。Pythonのプログラムにおけるデータは全て、オブジェクトまたはオブジェクト間の関係として表されます。オブジェクト指向の基本であるクラスとインスタンスについて紹介します。
クラス
クラスは、データや処理の定義をまとめた雛型のようなものです。
例えば、クラスとは「ハイエース(自動車)の設計図」です。ハイエースの部品としてメソッドが存在しています。
インスタンス
インスタンスとは、クラスを実体化したものです。クラスのデータやメソッドを使うためには「インスタンス」と呼ばれるものを生成する必要があります。ひとつのクラスに対してインスタンスは複数生成することができます。また、それぞれのインタンスは別々のデータをもちます。
クラスが「ハイエースの設計図」だとすると、インスタンスは「設計図をもとに作られたハイエース」です。
オブジェクト
オブジェクトとは、クラスとインスタンスなどの内部構造を持つデータです。つまり、クラスとインスタンス全体を抽象的に(ざっくりと)表現したものです。
「ハイエースの設計図」がクラスで、「設計図をもとに作られたハイエース」がインスタンスです。オブジェクトとは「自動車」にあたります。
- クラス:ハイエースの設計図
- インスタンス:ハイエース
- オブジェクト:自動車
インスタンスとオブジェクトの違い
オブジェクト指向プログラミングでは、すべてのモノや事柄を「オブジェクト」として捉えています。この時点でクラスという概念がなくても、オブジェクトは存在します。
一方、インスタンスとはクラスという概念を具象化したものです。PyhtonやJava言語において、ほぼすべてのオブジェクトはクラスから作られますので、オブジェクト=インスタンスとなります。このことから開発現場では「インスタンス」と「オブジェクト」を使い分けずに使用することが多いです。
クラスの使用例
以下のようにクラスを記述します。
class Hiace: val = 100 def handle(self): self.wheel('call method') def wheel(self,msg): print("{0}".format(msg)) print(("{0}".format(self.val))) cars = Hiace() cars.handle()
以下のような結果が表示されます。
call method 100
処理の流れ
Hiaceクラスのオブジェクトcarsを生成します。
carsオブジェクトが、handleメソッドを呼び出します。
carsオブジェクトのhandleメソッドは、carsオブジェクト(=自身)のwheelメソッドを呼び出します。
carsオブジェクトのhandleメソッドは、引数のmsgを出力します
wheelメソッドは、carsオブジェクトの変数valを出力します。
解説
Pythonではクラスはclass クラス名 :で作成します。クラス名の先頭は大文字です。
class Hiace:
クラス変数とクラス内関数(=メソッド)は字下げを使用して定義します。
val = 100 def handle(self):
self引数
「cars.handle()」には引数が存在しないのに、Hiaceクラスの「def handle(self):」にはself引数があります。Pythonではメソッドは最低1つの引数を持つ決まりになっていて、最初の引数は必ずself
という名前にする慣例があります。
selfには「インスタンス自身」が入り、selfを使用することでオブジェクト自身の変数を取得したり、メソッドを呼び出すことが出来ます。Javaで言う「this」です。
オブジェクト(インスタンス)は 「インスタンス = クラス()」で生成します。
cars = Car()
メソッドは、オブジェクト.メソッド()で呼び出します。
cars.handle()
インスタンスの初期化(コンストラクタ)
以下のように変更します。この例では、インスタンスの生成後にset_valueメソッドを用いて変数 value の値を初期化します。
class Hiace: def set_value(self, text): # インスタンス生成時に自動的に呼ばれるメソッド self.val = text def print_value(self): # 変数 value の値を表示するメソッド print(self.val) def handle(self): self.wheel('call method') def wheel(self,msg): print("{0}".format(msg)) print(("{0}".format(self.val))) if __name__ == "__main__": cars = Hiace("abc") # MyClass のインスタンスを生成 cars.set_value("abc") # 変数 value に文字列 "abc" を代入 cars.print_value() # abc
しかし、このような記述の方法はあまり良くありません。複数のインスタンスを生成するとき、何度もvalの値を初期化しなくてはならず、コードの記述量が増えたり、初期化をし忘れたりしてしまう可能性があります。このような問題を解決するために、クラスの初期化メソッドを使用します。
コンストラクタメソッド(__init__())
以下のように変更します。
class Hiace: def __init__(self, text): # インスタンス生成時に自動的に呼ばれるメソッド self.val = text def print_value(self): # 変数 value の値を表示するメソッド print(self.val) def handle(self): self.wheel('call method') def wheel(self,msg): print("{0}".format(msg)) print(("{0}".format(self.val))) if __name__ == "__main__": cars = Hiace("abc") # MyClass のインスタンスを生成 cars.print_value() # abc
解説
Pythonではコンストラクタメソッド 「__init__()」を使用することで、インスタンス生成時に初期化処理を記述します。「__init__()」はインスタンス生成時に自動的に呼ばれます。
def __init__(self, text):
初期化メソッドの「 __init__() 」には第1引数に必ず self を渡すようにします。selfにはインスタンス自体が渡されます。これにより、初期化メソッド内でインスタンス変数を作成したり、参照したりすることができます。
クラスを生成するときに指定した引数は、初期化メソッドの2番目以降の引数(ここではtext)に渡されていきます。
デストラクタ
コンストラクタの逆で、オブジェクトが不要となりPythonが削除する時に自動で実行される関数です。
def __del__(self, text):
解説
「__del__」という名前のメソッドで定義します。しかし、以下のような理由でほとんどの場合デストラクタは定義しません。
- 仕様上、プロセス終了までにデストラクタが必ず呼び出される保証がない
- 複数のオブジェクトが相互作用する場合、どのオブジェクトのデストラクタを先に実行するか決定できないため挙動が怪しい
- Python 114
- 制作 54
- RaspberryPi 41
- Django 40
- WordPress 40
- Linux 27
- VPS 22
- JavaScript 21
- PHP 20
- HTML・CSS 19
- AWS 16
- 仮想環境 15
- レスポンシブデザイン 13
- マイコン 11
- WEB全般 11
- 動画製作 9
- Webサービス 8
- 統合開発環境 8
- 機械学習 8
- PyCharm 7
- jQuery 7
- AfterEffects 7
- 起業・設立 7
- Django REST framework 6
- C# 6
- デザイン 6
- SEO 6
- pydata 6
- Visual Studio 5
- 数学 5
- 携帯サイト 5
- heroku 5
- Mac 5
- illustrator 5
- node.js 5
- Anaconda 5
- Nginx 4
- Jupyter Notebook 4
- インフラ 4
- Google Colaboratory 4
- symfony 4
- Webスクレイピング 3
- photoshop 3
- Go言語 3
- PC 3
- ツール 3
- Docker 3
- facebook 3
- 作業効率化 3
- データベース 3
- Cloud9 3
- コマンド 2
- micro:bit 2
- Kali Linux 2
- Webサーバー 2
- MariaDB 2
- ドローン 2
- コンテナ 2
- DaVinci Resolve 2
- ネットワーク 2
- Java 2
- movie 2
- PCDJ 2
- 音楽 2
- XSERVER 2
- Ansible 1
- Vue.js 1
- JSON 1
- Bootstrap 1
- バージョン管理システム 1
- SSL 1
- S3 1
- ムームードメイン 1
- ネットワーク 1
- アニメーション 1
- D3.js 1
- Rhino 1
- アニメ 1
- git 1
- windows 1
- アクセス解析 1
- スマートフォン 1
- アフィリエイトノウハウ 1
- 知識 1
- TypeScript 1
- 役立つ本・書籍 1
- データサイエンス 1
- ESP32 1
- AI 1
- ownCloud 1
- API 1