オブジェクト(class)の作成-その1

記事の内容

 この記事では、class宣言により、インスタンス変数、インスタンスメソッドのみをもつオブジェクトの作成方法を説明します。「クラスオブジェクトって何だろう?」という方はオブジェクト、クラスの基本の記事を先に読むことをおススメします。

***わからない用語があるときは索引ページへ***

この記事のサンプルプログラムは、Python3系をベースとしています。Python2系は、クラス宣言の記述ルールが異なるのでご注意ください。

1.オブジェクトを作成してみる

 class_ex1.pyのKagensanクラスは、x,yの2つのインスタンス変数と、tashizan, hikizanの2つのインスタンスメソッドをもつクラスです。

 後ろの記事でこのサンプルプログラムに沿って、Pythonのオブジェクトの作成の仕方を説明していきます。

##class_ex1.py

##class宣言。オブジェクトKagensanの定義
class Kagensan:
   
   ##コンストラクタの作成
   def __init__(self, a, b):
       self.x = a
       self.y = b
   
   ##インスタンスメソッドの作成
   def tashizan(self):
       wa = self.x + self.y
       
       return wa
   
   def hikizan(self):
       sa = self.x - self.y
       
       return sa

   
##プログラム実行開始位置
##Kagensanクラスに渡す引数のセット
x = 5
y = 3

##インスタンスの生成
##足し算用と引き算用と2つのインスタンスを生成
ins = Kagensan(x, y)

##インスタンス変数を読んでみる
print("インスタンス変数の読み込み")
print("インスタンス変数x:", ins.x)
print("インスタンス変数y:", ins.y)
print("\n")

##インスタンスメソッドtashizan()の実行
print("インスタンスメソッドの実行")
##インスタンスメソッドtashizan()の実行
wa = ins.tashizan()
print("x + y =", wa)

##インスタンスメソッドhikizan()の実行
sa = ins.hikizan()
print("x - y =", sa)
print("\n")

実行結果

インスタンス変数の読み込み
インスタンス変数x: 5
インスタンス変数y: 3

インスタンスメソッドの実行
x + y = 8
x - y = 2

2.クラス作成方法の解説

2.1.クラス宣言

 class文で、Kagensanという型(クラス名)のオブジェクトを作成することを宣言しています。関数の定義同様、class定義の中身はclass文のプログラムブロックの中で書いていきます。

class Kagensan:

class文の記述規則は、

class <クラス名>:

となります。class宣言文の最後に":"(コロン)をつけます。また、クラス名に使える文字や規則は、変数や関数と同じです。

補足1
 Pythonのコーディング規約であるPEP8では、クラス名は先頭大文字の単語をつなげて命名するべきとあります。このnoteの記事でも、この規約に沿ったクラス名を使うこととします。

補足2
 Python2系のclass宣言文の書式は、
  class <クラス名>(object):
となります。この書き方はPython3系でもそのまま使えます。class_ex1.pyでも、class文を
  class Kagensan(object):
と書くこともできます。
()の中の"object"って何だろう?については、クラスの継承の記事で説明します。

2.2.コンストラクタの作成

 class_ex1.pyのclass定義のプログラムブロックでは、最初に、"__init__"という変な名前の関数、すなわちメソッドが宣言されています。
 メソッド名"__init__"は、特別な意味をもつメソッドで、クラスのインスタンスを生成するときに、無条件で実行されるメソッドです。__init__メソッドのことを、コンストラクタと呼びます。コンストラクタはメソッドなので、作成方法は関数と同じです。

  Pythonのプログラムでは、__<関数名>__や、__<変数名>__のように、"_"(アンダースコア)2つで始まって、"_"(アンダースコア)2つで終わる名前の関数や変数をしばしば見かけます。Pythonで特殊関数や特殊変数として利用できる関数や変数は、この命名規則を使っています。
 自分でも同じような関数名や変数名を定義することもできるのですが、プログラムが紛らわしくなるのでやめておきましょう。


 コンストラクタの中身をみてみましょう。

   ##インスタンスコンストラクタの作成
   def __init__(self, a, b):
       self.x = a
       self.y = b

 コンストラクタの第1引数selfは、自分自身のインスタンスです。とりあえずここでは、「__init__コンストラクタの第1引数は、Pythonインタープリタから自動的に渡される、自分自身のインスタンス」のように考えて差し支えありません。
 変数名は何でも良いのですが、慣例としてselfという変数名を使います。クラス定義のプログラムブロックの中で、自身のインスタンス変数を読み書きしたり、インスタンスメソッドを実行したりするときは、

self.<インスタンス変数名>
self.<インスタンスメソッド名>()

の記述規則で呼び出します。

 __init__コンストラクタの第2引数以降の引数は、クラス呼び出し(インスタンス生成)の際に指定する引数です。class_ex1.pyのインスタンスの生成部分をみてみましょう。

ins = Kagensan(x, y)

 insというインスタンス名でKagensanクラスのインスタンスを生成しています。
 コンストラクタである__init__メソッドは、この、インスタンス生成のときに自動的に実行されます
 ここで、Kagensanクラスを呼び出すときに引数として設定されている、xとyは、__init__コンストラクタの第2引数以降に順番に渡されますコンストラクタの第1引数selfは、インスタンス生成の際には指定しません

インスタンスは、

<インスタンス変数名> = <クラス名>(引数, ・・・)

の形式でクラスを呼び出すことにより、生成します。

補足
クラスの作成において、多くの場合、コンストラクタを定義します。しかし、コンストラクタの作成は必須ではありません。インスタンス生成の際にコンストラクタを実行する必要がない場合は、コンストラクタの定義を省略することができます

3.3.インスタンス変数の設定

 もう一度__init__コンストラクタのプログラムブロックに戻ります。
 class_ex1.pyの__init_コンストラクタの第1引数selfは、クラス定義の中で、自分自身のインスタンスを表してます。後ろのa,bは、インスタンス生成の際、渡された引数です。ここでは、引数a,bから、インスタンス変数xとyを設定しています。

   def __init__(self, a, b):
       self.x = a
       self.y = b

 インスタンス変数は、インスタンス生成後、インスタンスから読み書きすることができます。

ins = Kagensan(x, y)

print("インスタンス変数x:", ins.x)
print("インスタンス変数y:", ins.y)

 最初の1行でインスタンスを生成するときに__init__コンストラクタが実行され、Kagensanクラスのインスタンスであるinsを生成しています。

 2行目、3行目はKagensanクラスのインスタンス変数xとyを出力しています。インスタンス変数は、

<インスタンス名>.<インスタンス変数名>

で指定します。
実行結果

インスタンス変数x: 5
インスタンス変数y: 3


インスタンス変数は、

ins.x = 100

のように、インスタンスから書き換えることもできます。

3.4.インスタンスメソッドの作成

 インスタンスメソッドは、コンストラクタ同様、class文のプログラムブロックで作成します。作成規則は、関数と同じです。class_ex1.pyでは、tashizan、hikizanの2つのインスタンスメソッドを作成しています。作成部分を見てみましょう。

 第1引数のselfは、コンストラクタのselfと同じで、自分自身のインスタンスです

   def tashizan(self):
       wa = self.x + self.y
       
       return wa

   def hikizan(self):
       sa = self.x - self.y
       
       return sa

 tashizanメソッドのプログラムブロックの最初の行で、インスタンス変数xとインスタンス変数yを加算し、計算結果を返しています。hikizanメソッドでは、インスタンス変数xからインスタンス変数yを引き算し、計算結果を返しています。

 class_ex1.pyで、tashizanメソッドと引き算メソッドの呼び出しを見てみましょう。
 メソッドの第1引数selfは、メソッド呼び出しの際には指定しません。メソッドtashizanとhikizanが受け取る引数はselfのみですので、呼び出しの際は引数不要となります。

wa = ins.tashizan()
print("x + y =", wa)

sa = ins.hikizan()
print("x - y =", sa)

出力結果

x + y = 8
x - y = 2

4.インスタンス変数とインスタンスメソッド

 オブジェクト基本の記事でも説明した通り、インスタンスを複数生成すると、それぞれのインスタンスは別に扱われ、互いに独立となります。class_ex1.pyで作成したKagensanクラスを使っておさらいしておきます。

##class_ex2.py

class Kagensan:
   
   ##インスタンスコンストラクタの作成
   def __init__(self, x, y):
       self.x = x
       self.y = y
   
   ##インスタンスメソッドの作成
   def tashizan(self):
       wa = self.x + self.y
       
       return wa
   
   def hikizan(self):
       sa = self.x - self.y
       
       return sa
   
##プログラム実行開始位置

##Kagensanクラスのインスタンスを2つ生成
ins1 = Kagensan(5, 3)
ins2 = Kagensan(10, 5)

##ins1のインスタンス変数を書き換える
ins1.x = 500
ins1.y = 300

##それぞれのインスタンスins1とins2は互いに独立
print("ins1.x =", ins1.x)
print("ins1.y =", ins1.y)
print("ins1.x + ins1.y =", ins1.tashizan())
print("\n")

##ins2のインスタンス変数は#ins1のインスタンス変数を書き換えてもかわらない
print("ins2.x =", ins2.x)
print("ins2.y =", ins2.y)
print("ins2.x + ins2.y =", ins2.tashizan())

実行結果
ins1のインスタンス変数を書き換えても、ins2のインスタンス変数は書き換わりません。

ins1.x = 500
ins1.y = 300
ins1.x + ins1.y = 800

ins2.x = 10
ins2.y = 5
ins2.x + ins2.y = 15

 インスタンス変数とインスタンスメソッドのみで作成されたクラスオブジェクトは、まずインスタンスを生成しないと利用できません

前の記事 次の記事

この記事が気に入ったらサポートをしてみませんか?