Image

Pythonのクラスはどうやって作って使うの?クラスについてわかりやすく解説

Pythonのクラスについて基本的な内容をできるだけわかりやすくまとめています。Pythonのクラスはある処理を行うためのグループのようなものです。ここではクラスの基本的な作り方と使い方を理解することができます。

Pythonのクラスの使い方をマスターしよう!!

今回はPythonのクラスについて学びます

Pythonにはクラスを扱うためのルールがあります。

使い方をわかりやすくまとめています。

クラスに関する基本的な内容を網羅しています。



目次

01. Pythonのクラスについてわかりやすく解説

_02. クラス変数とインスタンス変数

_03. メソッド

_04. アクセス制限

_05. コンストラクタ

_06. デストラクタ

_07. 文字列化

_08. クラスの継承

_09. 親クラス

_10. クラスの多重継承

_11. クラス階層

12. まとめ


01. Pythonのクラスについてわかりやすく解説


まずはPythonについて簡単に解説します。

Pythonのクラスをレシピに例えて理解してみましょう

繰り返し同じ処理をする場合決まったデータとしてレシピがあると便利ですよね

ここでいうレシピがPythonにおけるクラスのイメージです


Pythonのクラスを理解するにはオブジェクト、クラス、インスタンスという言葉の理解が必要です。

クラスデータを処理する方法が書かれたレシピです。

クラスにはデータの処理方法が定義されます。

インスタンスは実際に処理されたものをいいます。

料理として例えるのなら完成した料理自体です。

オブジェクトクラスとインスタンスをまとめた存在として捉えるといいと思います。


この考え方はオブジェクト指向の理解にもつながります。

しっかりと押さえておきましょう。



## Classの基本
class OurClass:
"""A simple example class""" #三重クォートによるコメント
## ここでは初期化を行っている
def __init__(self): #コンストラクタ
self.name = ""
## クラス内の関数はメソッドという
def gets(self): #gets()メソッド
return self.name
## クラス内の関数はメソッドという
def sets(self, name): #sets()メソッド
self.name = name
## クラスの呼び出しと実行
instance = OurClass() #クラスのインスタンスを生成
a.sets("Tanishi") #setName()メソッドをコール
print a.gets() #getName()メソッドをコール


クラスはこのようにして定義し使用することができます。


_02. クラス変数とインスタンス変数


クラスはクラス変数とインスタンス変数を持つことができます

インスタンス変数インスタンスごとに独立の変数インスタンス.変数名で表すことができます

クラス変数クラス名.変数名で表すことができます



## Classの基本
class MyClass:
def __init__(self):
self.name = "" #インスタンス変数
## インスタンスの作成
n1 = MyClass()
n1.name = "Takeshi"
## インスタンスの作成
n2 = MyClass()
n2.name = "Tanishi"

print n1.name # >>> Takeshi
print n2.name # >>> Tanishi


self.nameselfには上記の例ではn1とn2が引数として与えられています

n1とn2がインスタンス変数です



## クラス変数について
class MyClass:
PI = 3.14 #>>> クラス変数
## クラス変数の呼び出し
print MyClass.PI #>>> 3.14


クラス変数のイメージはクラス名をつけることでクラス内の変数にアクセスできるといったようなイメージです



## クラス変数と初期化メソッドの動き
class MyClass:
count = 0 #クラス変数を初期化
## 実行されるメソッド
def __init__(self):
## クラス変数を呼び出し
MyClass.count += 1 #クラス変数をカウントアップ
## インスタンスを作成
n1 = MyClass()
n2 = MyClass()
print MyClass.count #>>> 2


クラス変数カウントアップします

クラス変数個数を数えます



## クラスの作成
class MyClass:
pass
## インスタンスの作成
n1 = MyClass()
n1.name2 = "Takeshi" #インスタンス変数の追加
MyClass.PI2 = 3.141593 #クラス変数の追加


クラス変数インスタンス変数はいつでも追加することができます



## クラスの作成
class MyClass:
PI = 3.14
## クラス変数の参照
n1 = MyClass()
n2 = MyClass()
print n1.PI #クラス変数 MyClass.PI(3.14) が参照される
n1.PI = 3.141593 #インスタンス変数 n1.PI が生成される
print n1.PI #インスタンス変数 n1.PI(3.141593)が参照される
print n2.PI #クラス変数 MyClass.PI(3.14) が参照される


クラス変数インスタンス変数はどこからでも参照可能です


_03. メソッド



## メソッドの挙動について
class MyClass:
name = ""
def setName(self, name): #第一引数は(self)
## クラス変数の呼び出し
self.name = name
## インスタンスの作成と呼び出し
a = MyClass()
a.setName("Takeshi")


クラスが持つ関数メソッドと言います

メソッドどこからでも参照可能です

第1引数にはクラスインスタンスを指定します

第2引数メソッド引数を受け取ります


_04. アクセス制限



## クラスとアクセス権限
class MyClass:
def __init__(self):
self.name = "tanaka"
self._name = "yamada"
self.__name = "suzuki"
## メソッド
def hello(self): print 'hello'
def _hello(self): print 'hello'
def __hello(self): print 'hello'

a = MyClass()

print a.name #参照できる
print a._name #参照できるが慣習的に参照しない
# print a.__name #参照できない(AttributeError例外)

a.hello() #参照できる
a._hello() #参照できるが慣習的に参照しない
# a.__hello() #参照できない(AttributeError例外)


クラス変数インスタンス変数は基本的にはどこからでも参照できるのでアクセス制限をつけることも可能です


_05. コンストラクタ



## __init__の役割
class MyClass:
def __init__(self, name):
self.name = name
def gets(self):
return self.name

a = MyClass("Tanaka")
print a.gets() #>>> Tanaka


__init__()メソッドクラスインスタンスが生成されたときに呼び出されます


_06. デストラクタ



## __del__はインスタンスが消滅するときに呼び出されます
class MyClass:
def __init__(self):
print "INIT"
def __del__(self):
print "DEL"
## インスタンスの生成と削除
a = MyClass() #>>> INIT
del a #>>> DEL


__del__()はクラスのインスタンスが消滅するときに呼び出されるのがデストラクタです


_07. 文字列化



## __str__は文字列化します
class MyClass:
def __init__(self, name):
self.name = name
def __str__(self):
return "My name is " + self.name
## インスタンスの生成
a = MyClass("Yamada")
print a #>>> My name is Yamada


__str__()インスタンスを文字列に変換する処理を定義します


_08. クラスの継承



## クラスの継承
class MyClass:
def hello(self):
print "こんにちは"
## 一つ目のクラスを継承したクラス
class MyClass2(MyClass):
def world(self):
print "世界"
## 二つ目のクラスのインスタンスを生成
a = MyClass2()
a.hello() #>>> こんにちは
a.world() #>>> 世界


クラスは継承することが可能です

引数を指定している部分に継承したいクラスを入力します

クラスを継承すると継承のもととなっているクラスのメソッドを利用することができます

継承のイメージはゲームなんかをやったことがある人はしやすいと思います。

合成前のキャラクターの技を引き継ぐようなイメージです。

ドラクエをやったことがある人ならわかっていただけるかも知れません...。



## 一つ目のクラス
class MyClass:
def hello(self):
print "こんにちは"
## 継承
class MyClass2(MyClass):
def hello(self): #親クラスのhello()メソッドをオーバーライド
print "こんにちは!"
## インスタンスの生成
a = MyClass2()
a.hello() #>>> こんにちは!


クラスの継承もととなっているメソッドに変更を加えることができます

変更を加えることはできますがもととなるクラスのメソッドに影響は与えません。


_09. 親クラス



## 親クラスについて
class MyClass1(object):
def __init__(self):
self.val1 = 1
## 継承
class MyClass2(MyClass1):
def __init__(self):
super(MyClass2, self).__init__()
self.val2 = 2
## インスタンスの生成
a = MyClass2()
print a.val1 #>>> 1
print a.val2 #>>> 2


super()では親クラスを参照します

第1引数にはクラス第2引数にはインスタンスを指定します

__init__()で親クラスを初期化しています

super()親クラスのメソッドを引っ張ってくることができるというわけですね


_10. クラスの多重継承



## クラスの多重継承について
## クラスA
class MyClassA:
def A(self):
print "MyClassA"
## クラスB
class MyClassB:
def B(self):
print "MyClassB"
## 多重継承
class MyClassC(MyClassA, MyClassB):
pass
## インスタンスの生成
a = MyClassC()
a.A() #MyClassAのメソッドも
a.B() #MyClassBのメソッドも使用できる


引数となる部分に継承したいクラスを入れることでいくつものクラスを継承することができます

これを多重継承といいます


_11. クラス階層


Pythonのクラスはトップレベルのクラスobjectを継承して作られています

Pythonのオブジェクトobjectクラスというものを継承して作られているというわけです

オブジェクトとはプログラミングで扱うコード上の全てのものを指します


12. まとめ


お疲れ様でした。

ここまで読んでいただきありがとうございました。

今回はPythonのクラスについて学びました。