こんにちは(@t_kun_kamakiri)(‘◇’)ゞ
この記事では、Pythonのクラスについて解説します。
この記事では主に「Pythonクラスの書き方」について解説しました。
「Pythonクラスの書き方」
を解説しています。
ただクラスって何?っていう人もいますよね。【後半】
- クラスとは何か?
- Pythonクラスの基本的な使い方
- インスタンス化
「クラスの継承」までは話が難しくなるので「クラスの継承」は次回の記事にします。
この記事はこんな人のために書きました。
- Pythonのクラスのコードの書き方を知りたい人
- クラスとは何かを知りたい人
- クラスの使い方を知りたい人
☟書籍も紹介しておきます。
こちらの本がPython初心者が挫折することなく勉強できる本です。
(本記事のようのPython使用環境と異なりますが、とてもわかりやすいので全く問題ありません)
クラスとは新しいデータの型を作る際の設計図
よく「クラスとは設計図である・・・・だから、クラスには実体がないからクラスのインスタンス化を行って・・・」と理解できない解説がされていますが(笑)
クラスとは、「オブジェクトの生成のためのひな型」です。
簡単に言うと、クラスは「何かを作る(処理する)ための指示が書かれたもの」ってことですね(^^)/
クラスとは「処理をひとまとまりにしたもの」!
プログラミング言語には「関数(メソッド)」というものがあります。
関数(メソッド)とクラスの違いは以下を見てください。
- 関数(メソッド)には、主に何かをするという処理が書かれています。
(もちろん変数も関数の中で定義できます。) - クラスには、変数と1つ以上の関数(メソッド)を持つことができます。
Pythonのクラスの書き方
では、さっそくPythonでのクラスの書き方について解説します。
Pythonでのクラスの書き方の手順は以下の通りです。
- クラスを定義する
1-1.データ(変数)を書く
1-2.メソッド(処理)を書く - クラスのインスタンス化を作成する
- インスタンス化したモノからメソッドを呼び出す
実際にコードで書く際のフォーマットは以下です。
1 2 3 4 5 6 7 8 9 10 11 12 13 | #1.クラスを定義する class MyClass: #変数を定義 1-1.データ(変数を定義) def method(self): # 処理 1-2.処理(メソッド)を書く #2.クラス(MyClass)のインスタンス化を作成する x = MyClass() #3.インスタンス化したモノ(MyClass)からメソッドを呼び出す x.method() |
例1:クラスのインスタンス化までする
いきなり難しいことをやっても理解ができず詰むだけです。
まずは、単純なプログラムから動くことを確認しつつ、どのような処理が行われているのかをひとつひとつ丁寧に見ていく方が良いでしょう。
ここで行うのは以下の2つです。
- クラスを定義する
- クラスのインスタンス化を行う
はじめて学ぶ人はコピペして動作を確認してみてください。
1 2 3 4 5 6 7 8 9 | #1.クラスを定義する class kamakiri: def name(self): return 'Hello World' #1-2.処理を書く #2.クラス(kamakiri)のインスタンス化を作成する instance = kamakiri() print (instance) |
実行結果
1 | <__main__.kamakiri object at 0x7f3976bd23c8> |
#2.でクラスのインスタンス化までを行いました。
それをprint文で出力すると「__main__.kamakiri」と出力されているのがわかります。
これは、「<自身のファイルの>.<kamakiriというクラス>というオブジェクトですよ」という意味です。
例2:インスタンス化したクラスから変数(データ)を呼び出す
次は実際に作成したクラスを使って、クラスの中の変数(データ)を呼び出してみましょう。
ここで行うのは以下の3つです。
- クラスを定義する
- クラスのインスタンス化を行う
- クラスの中の変数(データ)を呼び出す
はじめて学ぶ人はコピペして動作を確認してみてください。
1 2 3 4 5 6 7 8 9 | #1.クラスを定義する class kamakiri: #1-1.データ(変数を定義) name = 'kamakiri' #2.クラス(kamakiri)のインスタンス化を作成する instance = kamakiri() print (instance.name) |
実行結果
1 | kamakiri |
クラスの中の変数を呼び出すときは、「<インスタンス化したクラス名>.<クラスの中の変数>」という形で書きます。
例3:インスタンス化したクラスから処理(メソッド)を呼び出す
次は実際に作成したクラスを使って、クラスの中の関数(メソッド)を呼び出してみましょう。
ここで行うのは以下の3つです。
- クラスを定義する
- クラスのインスタンス化を行う
- クラスの中の変数(データ)を呼び出す
はじめて学ぶ人はコピペして動作を確認してみてください。
1 2 3 4 5 6 7 8 9 10 11 | #1.クラスを定義する class kamakiri: #1-2.メソッド(処理を定義) def name_function(self): return 'Hello World' #2.クラス(kamakiri)のインスタンス化を作成する instance = kamakiri() print (instance.name_function()) #関数を呼び出すときは()をつける |
実行結果
1 | Hello World |
クラスの中の処理(データ)を呼び出すときは、「<インスタンス化したクラス名>.<クラスの中の関数()>」という形で書きます。
※ここでひとつ注意です。
クラスの中の変数を呼び出すときは変数「クラスの中の変数」を「.(ドット)」の後ろに書けばよかったのですが、クラスの中の変数を使う場合は「変数(データ)と関数(メソッド)を区別するために()カッコ」が必要です。
これは、クラスの中の関数を呼び出す際に引数を渡すことができるためです。
- 何も引数を渡さず関数の中の処理だけを行う場合()の中は何も書かない
- 関数に引数を渡して関数の中の処理を行う場合()の中に引数を書く
このくらいの違いだと考えてください。
ところでなぜ「def name_function(self):」といふうに関数の引数に「self」と書く必要があるのでしょうか?
その答えは「例5」でお話ししましょう!
では、次に関数に引数を渡す場合をやってみましょう。
例4:クラスの中の関数に引数を渡す
次は実際に作成したクラスを使って、クラスの中の関数(メソッド)を呼び出してみましょう。
ここで行うのは以下の3つです。
- クラスを定義する
- クラスのインスタンス化を行う
- クラスの中の関数(メソッド)に引数を渡して呼び出す
はじめて学ぶ人はコピペして動作を確認してみてください。
1 2 3 4 5 6 7 8 9 10 11 | #1.クラスを定義する class kamakiri: #1-2.メソッド(処理を定義) def name_function(self,x,y): return x+y #2.クラス(kamakiri)のインスタンス化を作成する instance = kamakiri() print (instance.name_function(10,20)) #関数を呼び出すときは()をつける |
実行結果
1 | 30 |
「instance.name_function(10,20)」とすることで、クラスの中の関数の引数に「10と20」が引き渡されて「x+y=10+20=30」という処理が行われました。
例5:クラスの中に初期化設定(__init__)を書く
例4までの例では「クラスのインスタンス化」を行って「クラスの中の処理を実行」を行っていましたが、
ここではクラスをインスタンス化した時点でクラスの中の関数を実行するという「__init__
メソッド」というものを使います。
ここで行うのは以下の5つです。
- クラスを定義する
- __init_メソッドを書く
- クラスのインスタンス化を行う(初期化したい引数を渡す)
- クラスの中の変数(データ)を呼び出す
- クラスの中の関数(メソッド)に引数を渡して呼び出す
はじめて学ぶ人はコピペして動作を確認してみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #1.クラスを定義する class kamakiri: name = 'kamakiri' #2.__init_メソッドを書く def __init__(self,a,b,c): self.name1 = a self.name2 = b self.name3 = c def name_function(self): return self.name + " " + 'Hello World' def sum_function(self): return self.name1+self.name2+self.name3 #3.クラスのインスタンス化を行う(初期化したい引数を渡す) instance = kamakiri(10,20,30) #4.クラスの中の変数(データ)を呼び出す print (instance.name_function()) #5.クラスの中の関数(メソッド)に引数を渡して呼び出す print (instance.sum_function()) |
実行結果
1 2 | kamakiri Hello World 60 |
例3でも疑問に思ったところだと思いますが、
なぜ「def name_function(self):」といふうに関数の引数に「self」と書く必要があるのでしょうか?
「self」というのは自分自身・・・つまりクラス名「kamakiri」自身という意味になのです。
- selfは自身のクラスの中の変数を使うという意味。
- インスタンス化された中の変数を使うという意味。
1 2 | def sum_function(self): return self.name1+self.name2+self.name3 |
↓以下がPython初学者のためのお勧めの参考書です。
ここまではPythonでのクラスの書き方についてでした。
この記事を読んでいる方はおそらく「クラスとは何か?」というよりは「Pythonでどうやってクラスを書くのか?」という疑問をお持ちの方だろうと想定しています。
Pythoのクラスの基礎はわかった人はここまでで十分なのですが、「そもそもクラスって何?」って方のために以下でクラスの概念についてさらっと解説をしておきます。
以降は、クラスの概念についてのお話をします。
クラスについて
- カプセル化
できるだけ他のプログラムから干渉されないように/他のプログラムに干渉しないようにする仕組み - 継承
再利用性を高める考え方 - ポリモーフィズム
振る舞いを様々に変えられる仕組み
クラスを作っておくことのメリット
- よく使う処理をclassで予め作成しておくことで、同じコードを何度も書く必要がない。
DRY(Don’t Repeat Your Self)原則と呼ばれ、日本語で繰り返し同じ処理を書くことを避けるという原則 - 処理の中身が知らなくても何かをインプットしたら何かがアウトプットされるという仕組みを使うことができる。
[…] 【Python初心者】クラスの基本定義とコードの書き方を解説する。 […]