スポンサーリンク

【Python】クラスとインスタンスの違いを超分かりやすく解説する

今回はPythonにおけるクラスとインスタンスについて解説していきたいと思います。このクラスを理解するためには、オブジェクト指向とは何かについても知る必要があります。

オブジェクト指向とは何か?

まずオブジェクト指向とは何かというと、処理内容ごとにプログラムをファイルに分けることを指します。

なぜ処理内容ごとに細かくファイルに分ける必要があるのかというと、数十行で書けるような簡単なプログラムの場合だと別に気になりませんが、数万行~になる大きなシステムを作るとなった場合、それを全て1つにファイルにまとめると、プログラムのメンテナンスする場合、どこのコードがプログラムのその部分なのか把握するのが非常に面倒になってしまいます。

そのため大きなシステム(プログラムを作る場合)はプログラムの作業内容ごとにファイルを分けることが推奨されています。これを「オブジェクト指向」と言います。

イマイチピンとこない人のために例を上げるならば、もしブログの記事をランダムでtwitterに挙げるプログラムを作ると場合、その処理内容は「ブログにアクセスして記事の内容を取得する」、「twitterにアクセスしてその内容をツイートする」という2つに分かれるので、プログラムのメンテナンスがしやすいようにそれぞれの処理を別のファイルにまとめて実行ファイル上からそれらのファイルを逐一呼び出すという流れになります。

こういった様々な処理を組み合わせたプログラムを作る場合は処理内容ごとに別々のファイルに分けて書いて、状況に応じて呼び出す仕組みにしておくことで、後からコードを見た人がメンテナンスしやすいようにしようというコードの書き方のことを「オブジェクト指向」なのです。

そして、Pythonにおいて、実行ファイル上に呼び出せる別のファイルに書いてあるプログラムのことをモジュール・ライブラリと言います。

※Pythonを勉強するとモジュールとライブラリの違いって何なの?と思うことがありますが、Pythonにおけるライブラリというのは別の場所から関数を呼び出す(API的な?)処理全般を指しているので、モジュール=ライブラリという認識でいいかなと思います。

例えばPython使う上で絶対書くであろう「import 〇〇」という処理はPCの別の場所に保存されている〇〇.pyに書かれたクラス・関数を呼び出しています。

クラスと関数って何のためにあるの?

このモジュール上によく書かれるクラスと関数ですが、なぜわざわざclass:だったりdef:だったりで一々処理を纏めるのかというと話ですが、まず関数を使う理由は大きく2つあります。

まず1つ目は「同じ処理を関数化することでコードを短くして見やすくする」というものがあります。そして2つ目は「細かい処理を関数という形で分けることでよりコードのメンテナンスをしやすくする」という理由からです。

例えば先ほどのTwitterに投稿するという処理ならTwitterにアクセスする・メアドとパスワードを入力してログインする・ツイートする・ブラウザを閉じるという4つの処理に分かれますのでそれぞれの処理ごとに関数を定義したりします。

そして、クラスとは何なのかというと一言でうまく言うのは難しいのですが、個人的な認識としては、モジュール(ライブラリ)がその処理に関する大まとめとした場合、クラスはいくつかの関数・基本データを含んでいる小まとめというイメージです。

そして、クラスを元にして便利な性質を新しくオブジェクトを生成することが出来ます。身近な例でいうならば、「Pandas」「Numpy」のPandas.dataframeやNumpy.arrayなんかは新しく作った便利なクラスの代表例ですね。他にもゲームなんかを作る場合は特定の種類のキャラクターの体力などの基本情報なんかをクラスにしてまとめることもあります。

スポンサーリンク

クラスとはオブジェクトの仕様書である

私たちがプログラミングにおいて変数(オブジェクト)を作る場合、基本的にそのオブジェクトがどういう性質なのか定義しなくてはいけません。

変数(オブジェクト)はstr intなどのクラスの中から作られます。すなわち、クラスは「どんな性質を持ったオブジェクトを作るか?」を書いたオブジェクトの仕様書、設計図だと言えます。

オブジェクトにどんな機能があるかは、そのオブジェクトの仕様が定義してあるクラスを知ればわかります(type() )。オブジェクトを作ったクラスは「型」と呼ばれますが、一応オブジェクトの型はクラス以外でも定義できます(構造体で定義できる)。型はオブジェクトの機能だけではなく、必要となるメモリサイズなども表します。

まあPythonの場合は向こうが定義したデータから勝手にクラスを推測して定義してくれる「動的型付け言語」なので、型のことが特に分からなくとも簡単に変数を作成できてしまいます。

例えばPythonだと

#変数を定義する
a='HELLO'

というオブジェクトを定義して、print(class(A))を実行するとstrと返されます。

#変数:オブジェクト(この場合だとa)のクラスを確認する
print(type(a))


※<class 'str'>

これはhelloという文字列を格納している「a」というオブジェクトのクラスが、strクラス(文字型)であることを示しています。本来Cやデータベースとかだと自分でstringと書いて、今から新しく作る変数は文字型だよ~と定義してあげなければいけませんが、Pythonの場合は基本的に向こうが勝手に型推測してクラスを付けてくれるので、こっちがわざわざ宣言する必要がありません。

プログラミングで初心者がエラーを連発して詰まる原因の大半は変数の型についてのあれこれなので、そこをあまり気にしなくていいというのが初心者にとって優しい点ともいえるわけですが、同時に型についての意識が薄くなってしまいます。

適当に変数を宣言しても勝手に型付けしてくれるのは、自分以外の大勢と一緒にプログラムを開発する大規模開発においてはネックになることもあるので、型を指定しなくていい動的言語についてはメリット・デメリットどちらともある印象です。

クラスとインスタンス(オブジェクト)の違い

そして、これも初心者の人から良く聞かれる質問ですが、クラスとインスタンスの違いについてもざっと触れておくと、Pythonにおけるインスタンスとは、オブジェクトを定義する際に呼び出されるクラスのことを指します。そういう意味では「クラス≒インスタンス」という認識で大丈夫だと思います。

具体例として皆さんがよく使う外部から呼び出ているであろうインスタンスの例を挙げると、Pandas.Dataframe()やnumpy.array()なんかが代表的だと思います。これらは最初に「import Pandas」「 import numpy」という風に宣言してライブラリからPandas.dataframe・numpy.arrayクラスを呼び出すことで使えるようになるインスタンスです。

PandasやNumpyのクラスの性質をもった変数(オブジェクト)を定義する際のpandas.dataframe()なんかの関数をインスタンスと言います。そしてクラスは外部から呼び出すものだけではなく、デフォルトでPythonに備わっているクラスもたくさんあります。

例えばPythonのプログラミング入門書で最初に出てくる数値、文字列、リスト、タプル、辞書型などは、すべてデフォルトでPythonに備え付けられているれっきとしたクラスです。

一応これらもインスタンスと言えばインスタンスですが、これらの型(クラス)は動的型付け言語では、わざわざ自分でクラス(型)を定義する場面があまりないので、そこまで意識する場面はありません。

# 変数に代入できるものは一応インスタンスオブジェクト

a = 1
※int(数値)


b = 'Helloworld!'
※str(文字)


c = [1,2,3,4]
※list(リスト)

インスタンスの存在を意識するのは、やはりPandasやNumpyでnumpy.array()やpandas.dataframe()を使って変数を定義する時ですね。こういったインスタンスおを使用して作られた関数はpandasやNumpyの性質を持っているので、変化率や移動平均が関数1つで簡単に計算出来たり、行列のように扱うことができるので便利です。

よく使われるクラスとインスタンスの例としては、たい焼きの型とたい焼きの例えななんかがあります。たい焼きの型がクラスでインスタンスとはたい焼きの型であり、このインスタンスにデータという汁を流し込んで出来上がるのが、オブジェクト(変数)という訳です。

出来上がるたいやきの形は同じだけれども、流し込む汁がチョコレートであればチョコ味になるし、カスタードであればカスタード味になります。インスタンスも同じでクラスとしての大まかな性質は同じだけども、型に入れるデータによって1つ1つ細かいところはオブジェクトとして異なるという感じです。

まとめ

オブジェクト指向プログラミングにおけるクラスとは、オブジェクトを生成するための設計図あるいはひな形に相当するもので抽象データ型の一つです。 クラス定義を行うことで、そのクラスの性質を持ったオブジェクトを作ることができるようになります。Pythonの場合はPandasやnumpyなど外部のライブラリに便利な機能を搭載したクラスが用意されています。

ここまでクラスとインスタンスについてざっと解説してきましたが、言葉だけではイマイチ実感がわかないと思うのでここからは実際にPython上でクラスと関数を作ってみたいと思います。

スポンサーリンク

プログラミングの独学はとても難しい


プログラミングは小学校の義務教育にも導入され始めており、これから社会人として生きていく上でプログラミングはもはや出来て当たり前、出来なれば論外というエクセルレベルの必須スキルになりつつあります。そしてそういう話を聞いて参考書なりを購入して独学でプログラミング勉強しようと思っている人も少なくないでしょう。しかしプログラミングを独学で勉強し始めようと思うものの



・「分からない箇所で詰まって挫折してしまった」

・「勉強する時間が足りない」

・「ネットの記事だと情報が断片的でよくわからない」

・「コードのエラーの原因が分からない」



という壁にぶち当たって、プログラミングの勉強を止めてしまう方が少なくありません。独学でプログラミングを勉強してる時間のほとんどはつまづいている時間です。実際僕も最初のころ独学でプログラミングを勉強していた頃はエラーの原因が分からず丸1日を不意にしてしまった・・・そんな苦い経験がありました。



それで僕は一度はプログラミングの学習を諦めてしまいましたが、就活で現実を知る中で「プログラミングを勉強して、いずれフリーランスとして自由な生き方がしたい」「エンジニアとして若いうちから高収入を得たい」という気持ちから一念発起して「侍エンジニアのwebサービスコース」に申し込み、プロのエンジニアの方に対面でマンツーマンでPythonによるWebサービス作り方とWeb技術の基本を教えてもらい、ようやくプログラミングが理解でき、今ではエンジニアとしてそこそこの暮らしができるようになりました。





侍エンジニアでは、とりあえずプログラミングやインターネットの基本を知っておきたい人から、HTML・cssなどでWebサイトやWebアプリを作ってみたい人やPythonを勉強してデータサイエンティストやAIエンジニアになりたい人まで幅広いニーズに応えた様々なコースが用意されています。



IT業界と言ってもエンジニアの仕事はプログラミング言語次第でサーバーから機械学習・ディープラーニングまで多種多様ですし、侍エンジニアの無料レッスン(カウンセリング)を受けてみて、自分のやりたいITの仕事は何なのか?を見つけるのがエンジニアへの第一歩になります。ちなみに今侍エンジニアの無料レッスンを受けると1000円分のAmazonギフト券がもらえるので、試しに受けてみるだけもお得です。


自分は半端に独学やオンラインスクールで勉強して金と時間を無駄にするくらいなら、リアルのプログラミングスクールに通ってしっかりプログラミングを勉強した方がいいと思います。ちなみに今、侍エンジニアに申し込むと、25歳以下の学生の方であれば、受講料が20%OFFになるので超お得です。


そして、プログラミングは大勢で授業を受けたり漫然とオンライン学習をするよりも自分が分からない箇所をピンポイントでプロの講師に直接質問して、ちゃんと納得するというスタイルの方がお金は確かに少し掛かりますが、独学で学ぶよりも絶対にモノになります。


シェアする

  • このエントリーをはてなブックマークに追加

フォローする