DjangoBrothers BLOG ✍️

2018/03/14

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

【Python】オブジェクト指向を理解するための超重要ワードまとめ

Pythonを勉強するときに必ず出てくる「関数、オブジェクト、属性、メソッド、クラス、インスタンス」という言葉についてです。 慣れるまでは結構頭の中ごっちゃになって何度も調べなおすことが多いのでまとめておきます。

1度基礎的な勉強はしたけど頭の中で整理しきれてない人用です。完全な初心者は対象としていません。

それでは、それぞれの語句について説明していきます。

関数(function)

何かしらの処理コードをひとまとめにしたプログラムのこと。関数を呼び出せば便利な処理が一発でできるようになります。

Python標準であらかじめ用意されている組み込み関数、自分で自由に作ることができるdef関数があります。

組み込み関数の例

あらかじめ用意されているので、何の設定をしなくても以下のような文字を使うだけで便利な機能がすぐ使えます。

代表的な例は、print( ), len( ), int( ), str( )などです。

len( )関数 文字数やリストの長さを取得できる

>>> len("Djangobrothers")
# 14

str( )関数 数字を文字列に変換

>>> age = 20
>>> print ("私は" + str(age) + "歳です。")
# 私は20歳です。

def関数の例

あらかじめ組み込まれた関数以外にも、自分で関数を作ることもできます。

「hello」という名前の関数を作ってみます。

「hello」関数を自作する

def hello():
    print ("こんにちは!")

# 関数を呼び出す
hello()
# こんにちは!

関数に引数を与えることもできます。今回はtriangle( )関数に引数bottom、heightを与えて、三角形の面積を求める関数を作ります。

「triangle」関数を自作する

def triangle(bottom, height):
    print ("底辺が" + str(bottom) + "、高さが" + str(height) + "の三角形の面積は、" + str((bottom * height) / 2) + "です。") 

# 関数を呼び出す
triangle(3,4)
# 底辺が3、高さが4の三角形の面積は、6.0です。

triangle(12,23)
# 底辺が12、高さが23の三角形の面積は、138.0です。

このように、1回関数を作ってしまえば、呼び出すだけで何度も似たような処理を行えるので便利です。

オブジェクト

「もの、物体」という意味。Pythonはオブジェクト指向(オブジェクトを中心とした考え方)のプログラミング言語なので、「全て」をオブジェクトとして捉えます。 「全て」って、なんのことかというと、文字列とかリストとか辞書のことです。

文字列"DjangoBros"も、リスト["apple", "banana", "orange"]も、辞書{"Japan":"Tokyo", "France":"Paris"}も、その他関数とかもみんなオブジェクトです。

全てのオブジェクトはデータ型(種類)を持っていて何かしらのデータ型に分類できます。「"DjangoBros"」は文字列(str)型、「5」のデータ型は数字(int)型、["apple", "banana", "orange"]はリスト(list)型です。

オブジェクトのデータ型はtype( )関数で調べられる

>>> type("django")
<class 'str'>

>>> type(4)
<class 'int'>

属性(attribute)

オブジェクトはそのデータ型ごとに属性(attribute)を持っています。属性の中には、「データ」と「処理」の2つがあり、データのことを「プロパティ」、処理のことを「メソッド」といいます。メソッドは各オブジェクトに結びついた関数だと考えればOKです。メソッドを使うことで、オブジェクトを操作することが可能です。

例えば、文字列型のオブジェクトは、upper( )メソッドやcount( )メソッドを持っています。

upper( )メソッド 文字列を全て大文字にする

"djangobrothers".upper()
# DJANGOBROTHERS

count( )メソッド 文字列の中に引数の文字がいくつあるかカウントする

>>> "なまむぎなまごめなまたまご".count("な")
# 3

リスト型のオブジェクトには、append( )メソッドなどがあります。

append( )メソッド リストの最後尾に要素を追加

>>> list = ["apple", "orange"]
>>> list.append("banana")
>>> print (list)
["apple", "orange", "banana"]

そのオブジェクトがどういった属性を持ってるか知りたいときはdir( )関数で一覧を確認できます。

dir( )関数で属性一覧を確認

>>> print(dir("djangobroters"))
# str型オブジェクトの属性一覧が表示される

>>> print(dir(["apple","orange","banana"]))
# list型オブジェクトの属性一覧が表示される

コードの書き方として、関数の書き方が関数名(オブジェクト)なのに対して、属性の書き方はオブジェクト.属性( )です。

クラス

クラスとは、似たようなオブジェクトを量産したい時のための「設計図」です。

例えばSNSの様なウェブサービスを作る場合、たくさんのユーザーオブジェクトができることになりますが、1人1人のユーザーオブジェクトをいちいち最初から作ってたんではめんどくさいです。

これらのユーザーオブジェクトって名前とか年齢情報の値は人によって違うけど、名前、年齢情報を持っているとこまでは一緒だよね。じゃあそこまでは共通のコードを使っちゃおうっていうのがクラスの考え方です。

ユーザーID、名前、年齢情報を持つユーザークラスを作成

class User:
    def __init__(self, id, name, age):
        self.id = id
        self.name = name
        self.age = age

    def my_name(self):
        print ("私の名前は" + self.name + "です。")

init()の部分は初期化メソッドといい、Userオブジェクト固有の変数を作っています。オブジェクト固有の変数をインスタンス変数と呼び、インスタンス変数はオブジェクトのプロパティとなります。self.nameのように、self.変数名とすることでインスタンス変数を定義することができます。

def my_name(self):のようにクラスの中で関数(def)を定義することでクラスメソッドを作っています。

クラス(設計図)があればインスタンス(後述)を簡単に量産できます。

インスタンス

「個体、実体」という意味。クラス(設計図)を元に作られたのオブジェクトのことです。

下のコードの様にUserクラスの設計図を使えばシンプルな記述で、ユーザーID、名前、年齢情報を持ったユーザーオブジェクトを簡単に作ることができます。

各インスタンスのプロパティは、「インスタンス.インスタンス変数名」で取得できます。クラスメソッドを使いたい時は、「インスタンス.クラスメソッド名」です。

インスタンスを利用する

# ユーザークラスを使ってインスタンスを作成
user1 = User(1,"ジョブス", 23)
user2 = User(2,"ローラ", 26)

# インスタンス情報を出力
print (user1.name)
# ジョブス

print (user2.age)
# 26

user1.my_name()
# 私の名前はジョブスです。

ちなみに、dir( )関数でそのオブジェクトが持つ属性を調べられることは既に紹介しましたが、もちろんインスタンスにもこの関数を使うことができます。

インスタンスが持つ属性を調べる

print (dir(user1))
#インスタンス「user1」が持つ属性が出力される
[・・・ 'age', 'id', 'my_name', 'name']

出力された文字列の後方に、先ほど自分で作ったメソッドやプロパティ(インスタンス変数)が表示されているのが確認できます。

説明はこれで以上です。ここで学習したことは、Djangoを理解する上でも非常に重要な概念となります。DjangoBrothersのチュートリアルでもベースとなる知識ですので、しっかりと整理しておきましょう!