• 䞀般瀟団法人Python゚ンゞニア育成掚進協䌚 顧問理事 寺田孊氏

    著者寺田孊
    䞀般瀟団法人Python゚ンゞニア育成掚進協䌚 顧問理事

䞀般瀟団法人Python゚ンゞニア育成掚進協䌚以䞋、圓協䌚の顧問理事の寺田孊です。私は詊隓の問題策定ずコミュニティ連携を行う立堎です。 基本的に、プログラムを曞くずきにはオブゞェクトを䞭心ずした考え方が前提ずなりたすが、Pythonの堎合は孊習し始めたばかりの段階でオブゞェクト指向を知らなければ勉匷ができないずいうものではなく、クラスやオブゞェクトを意識しなくおも䜿いこなすこずができたす。 ずはいえ、もし今埌、フレヌムワヌクを䜿甚しお䜕かを䜜りたいず考えおいるのであれば、クラスやオブゞェクト指向に぀いお理解をしおおいた方がスムヌズに進むのは確かです。 そこで今回は、実践詊隓の範囲であり、䞻教材の4章にも掲茉されおいる「クラス」や「オブゞェクト指向」に぀いお回に枡っおお話ししたいず思いたす。

Pythonはオブゞェクト指向を知らなくおも䜿いこなせるけど 

Pythonは、様々なプログラミングパラダむムをサポヌトしおいるため、オブゞェクト指向によるプログラミングはもちろん、手続き型のように䞊から順番に凊理をさせたり、凊理をたずめお関数化させたりずいったこずもできたす。 たた、プログラミングパラダむムには関数型プログラミングずいう考え方があり、Python自䜓は玔粋な関数型プログラミングで曞くこずはできたせんが、それに近い関数型蚀語のように曞くこずはできたす。 こういった様々な圢で曞くこずができるPythonはオブゞェクト指向にこだわる必芁がない蚀語であるず同時に、マルチパラダむムな蚀語であるず蚀われおいたす。 こういった特城から、Pythonは孊習を始める段階でオブゞェクト指向やクラスを意識せずずも䜿いこなすこずができたすし、それらを知らなければ勉匷ができないずいうこずはありたせん。 特にデヌタ分析の䞖界では、クラスによっお独自のオブゞェクトを意識しおプログラミングをするずいったケヌスは非垞に少ないはずです。

䞀方で、Webやスクレむピングなどのフレヌムワヌクを䜿うケヌスでは、クラス構文を䜿い、オブゞェクトを継承しお様々なものを䜜るずいうこずはよくありたす。そのため、フレヌムワヌクを䜿うのであればオブゞェクト指向ぞの理解は比范的求められるこずになり、芋よう芋たねでは限界を感じる堎面に出くわすこずがあるず思いたす。

たた、Pythonのint、str、dict、listなどの暙準のデヌタ型はオブゞェクト指向でできおいるため、その考え方に則ったメ゜ッドが存圚したす。そのため、Pythonを完党に䜿いこなしお、様々なものを理解するずいう意味では、オブゞェクト指向を理解しおおくず勉匷になりたすし、その先ぞの発展にも぀ながりたすので、ある皋床孊習が進んだ段階で理解を進めおおくこずをおすすめしおいたす。

オブゞェクト指向ずはなにか

オブゞェクト指向を厳密に説明するのは難しいので今回は深く蚀及したせんが、「クラスによっお、独自のデヌタ型を開発する」ものであるず考えおください。

たず、クラス構文を䜿うこずで、実䜓ずなるものの倧元の圢を定矩したオブゞェクトの「ひな圢」ず呌ばれるものを䜜るこずができたすこれはデヌタ型ずも呌ばれたす。 クラスにはデヌタを保持するためのものデヌタ属性ずメ゜ッドがあり、デヌタ属性には保持するもののデヌタを入れたり、䞭間デヌタを入れたりしたす。 䞀方のメ゜ッドは、クラスの䞭にdef構文で曞くこずで振る舞いや操䜜をするずいった、動䜜をしたりするものを蚀い、むンスタンス化されたオブゞェクトから呌び出すこずができたす。 そしお、そのオブゞェクトのひな圢に基づいお「むンスタンス化実䜓化」したものを「むンスタンス」ず呌びたす。

぀たり、足し算や匕き算ずいった動䜜メ゜ッドの準備をしおいるものがクラス構文によっお䜜られた「ひな圢」で、この「ひな圢」を䜿っお埗た結果が「むンスタンス」、ずいうこずになりたす。

オブゞェクト指向を䜿った開発のメリットはコヌド量の削枛ず、管理の楜さ

オブゞェクト指向のメリットは管理したいオブゞェクトに察しお最初から振る舞いを定矩し、継承させられるこず、それによっおコヌドの量を枛らせるなど、埌々の凊理を楜にできるずいうこずにありたす。

  • 各クラスはナヌザヌクラスの特城を匕き継いでいながら、それぞれのクラスで必芁な属性を远加・䞊曞きするこずができる

たずえば、䞊図のような「ナヌザヌクラス」ずいう「ひな圢」を䜜成した堎合、このひな圢が持぀特城を継承させた新たなクラスを甚意するこずができたす。䞊図の䟋で蚀えば先生クラス、生埒クラスがそれにあたりたす。 各クラスはナヌザヌクラスの特城を匕き継いでいながら、それぞれのクラスで必芁な属性を远加・䞊曞きするこずができたす。

ナヌザヌクラスがベヌスずなっおいるため、先生・生埒のクラスから氏・名・よみがな・性別・幎霢ずいった基本的な項目を取埗するこずが可胜です。たずえばWebサむトのログむン埌に氏名を衚瀺させるメ゜ッドを䜜成すれば、生埒クラスからも氏・名の項目を取埗できたす。たた、よみがなの最初の文字を取埗しお䜕かの凊理をさせるずいったこずも可胜です。

先に挙げた䟋で蚀えば、四則挔算ずいう動䜜メ゜ッドを最初からオブゞェクトに持たせた状態で継承させられれば、そのためのスクリプトを毎回甚意する必芁はなくなりたす。 たた、リストで利甚できるリスト名.appendずいうメ゜ッドがありたす。これはクラス構文で定矩された決たりに基づいた1, 3ずいうリストがあったずきに、リスト名.apend(5)を実行するこずによっお リストの䞭身を[1, 3, 5]に倉曎するこずができるずいうもので、これもたたあらかじめ振る舞いを定矩されたメ゜ッドのひず぀です。

こういった、あらかじめ振る舞いが定矩されたものが甚意されおいるからこそ、様々な凊理を簡易・容易に行うこずができるようになりたす。 「ひな圢」があっお、「むンスタンス化しお䜿っおいる」ず意識し、クラスにどういったものが実装されおいるかによっお、むンスタンス化された偎の振る舞いや、デヌタの持ち方が倉わっおくるずいうこずを芚えおおきたしょう。

むンスタンス自身を瀺す第䞀匕数、selfは省略しないで

さお、クラスを曞いおいお、䞀番わかりにくいポむントはメ゜ッドの第䞀匕数ずしお曞かれるselfです。 selfはむンスタンス自䜓を瀺すもので、Pythonでメ゜ッドを定矩する際には必ず第䞀匕数にselfを曞きたすが、呌び出す時にはselfが自動的に枡る仕組みになっおいたす。 ここで、それならなぜメ゜ッド定矩時に曞く必芁があるのかず疑問に思うかもしれたせん。

前述の通り、メ゜ッドは基本的にdefで定矩されたすが、メ゜ッドの䞭にはselfを匕数に取らないものも存圚したす。 これは曞籍でも解説しおいたすが、クラスメ゜ッドの第䞀匕数にはクラスオブゞェクトが来たすし、スタティックメ゜ッドであればselfを取らないずいうこずです。

selfを曞かなくおもいいのではないかずいう議論は深くなりがちなずころではありたす。 実際、呌び出すずきには自動的にむンスタンスがselfに枡るため、省略できるずいえばそうであり、極論は「selfでなくおもなんでもいい」ずも蚀えたす。 しかし、埌々のコヌドの読みやすさを考えれば、selfず曞いおおいた方がいいず私は考えおいたす。

本皿ではここたでにし、次回は特殊メ゜ッドずデヌタ型の保蚌に぀いおお話ししたいず思いたす。

圓協䌚の最新情報は公匏サむトか、公匏Facebookペヌゞでご芧いただけたす。FacebookペヌゞではPythonに関連したニュヌスもお知らせしおいたすので、ぜひフォロヌしおみおください。たた、YouTubeチャンネル「Python゚ンゞニア認定詊隓」では、私が詊隓抂芁や孊習のコツをお話ししたものや、合栌した方のコメント動画を公開しおいたす。こちらもぜひご芧ください。

[PR]提䟛Python゚ンゞニア育成掚進協䌚