🔖

Pythonのオブジェクト指向の必須事項の理解

2021/04/28に公開

この記事は以下リンクの記事を参考にしています。

Pythonのオブジェクト指向を理解する上での必須事項をとても簡単にわかりやすくまとめてくれている記事になっていますのでもしよければ参照してください。
https://djangobrothers.com/blogs/basic_knowledge_of_python/
[]

・関数
何かしらの処理コードをひとまとめにしたプログラムのこと。関数を呼び出せば便利な処理が一発でできるようになる。
Python標準であらかじめ用意されている組み込み関数、自分で自由に作ることができるdef関数がある。

組み込み関数の例

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

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

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

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

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

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)型。

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

"djangobrothers".upper()

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

3

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

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

print(dir("djangobroters"))

str型オブジェクトの属性一覧が表示される

print(dir(["apple","orange","banana"]))

list型オブジェクトの属性一覧が表示される

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

クラス
クラスとは似たようなオブジェクトを量産したい時のための「設計図」。
例えば、SNSのようなWebサービスを作る場合、たくさんのユーザーオブジェクトができることになるが、1人1人のユーザーオブジェクトいちいち最初から作っていたんではめんどくさいのでこららのユーザーオブジェクトって名前とか年齢情報の値は人によって違うけど、名前、年齢情報を持っているとこまでは一緒なので、そこまでは共通のコードを使おうっていうのがクラスの考え方。

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

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

int()の部分は初期化メソッドといい、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(uer1))
#インスタンス「user1」が持つ属性が出力される。
[・・・ 'age', 'id', 'my_name', 'name']

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

Discussion