Python はじめから勉強 Hour4：オブジェクト指向①

# Python はじめから勉強 Hour4：オブジェクト指向①

* Pythonで何かしようとしたときに、まずサンプルスクリプトを探してなんとなく実行してた私が、
* 自動実行でREST API叩いて、結果の確認、VM操作までやってみたいと思う7時間
* 今回はオブジェクト指向。まぁ意味は分からずともメソッド使えればいいんじゃないでしょうか。



## 学習資料

* たった 1日で基本が身に付く！ Python超入門 
  * https://a.r10.to/hbHMiv



## 過去の投稿

* [Pythonはじめから勉強 Hour1：Hello World](https://qiita.com/matsumo2019/items/5a69381f44456e6e6a5d)
* [Pythonはじめから勉強 Hour2：制御文](https://qiita.com/matsumo2019/items/6daa862fd34c8929fb65)
* [Pythonはじめから勉強 Hour3：関数](https://qiita.com/matsumo2019/items/6c63c737c27e51000f79)



## 環境

* Windows
* Python Ver3系



## オブジェクト指向とは

* 既に学んでいますが、プログラムでは文字列や整数、リストなどを扱ってきました。
* でも扱っているのは**123などの数字**であり、「整数」というものを扱っているわけではありません。
* というわけで「整数」といった概念の実体である123。
* この関係がクラス(整数）とインスタンス(123)の関係です。
  * あれ？「オブジェクト」って言葉はどこ行った？
  * インスタンス≒オブジェクトで良いそうです。個人的にはインスタンスのほうが分かりやすい



## メソッドとは

* クラスごとに取り扱える振る舞いのこと
* 整数のインスタンスは、「絶対値を取る」とか「符号（＋－）を反転させる」といった関数のようなものは欲しいですが、文字列に対して「絶対値を取る」といった処理は全く不要。
* なので、クラスごとに関数を定義し、そのインスタンスだけ使えるもの
* 例えば文字列を大文字にしてみる。

```python
>>> a ='hogeo'
>>>
>>> print(a)
hogeo
>>>
>>> print(a.upper())
HOGEO
>>>

```

 * インスタンスの後ろに「. (ドット）」を置いて、続いてメソッド名とその引数を記述することえ扱えます。

* もう一つ例：リストを操作する

```python
>>> my_list = ['abc', 'def', 'ghi']
>>> print(my_list)
['abc', 'def', 'ghi']　　　　　
>>>
>>> # リストに値を追加
>>> my_list.append('jkl')			### my_listインスタンスのあとにappend()メソッドを指定
>>> print(my_list)
['abc', 'def', 'ghi', 'jkl']         ### リストに値が追加されています
>>>
>>>
>>> my_list.reverse()                ### 順序を逆にするメソッド
>>> print(my_list)
['jkl', 'ghi', 'def', 'abc']
```



## どんなメソッドがあるか調べる

* メソッドなんて覚えられれないのでその時にはdir()関数で確認できます。
*  ＿アンダースコアで囲まれたものは特殊属性というものらしい。使い方はまた今度
  *  'as_integer_ratio', ~, 'to_bytes'が一般的なメソッド

```python
>>> dir(1)        ###整数にどんなメソッドがあるのか
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
>>>　　　　　　　　　　###最後の to_bytesとか分かりやすいですね。
>>>
>>> dir('abc')
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>>
```



## リスト インスタンス のメソッドで遊んでみる

* Pythonのプログラミングでリストは頻繁に使われるのでいろいろ試してみる

* 

```python
>>> ### リストの初期化
>>> my_list = ['a', 'b', 'c', 'd']

>>> ### appendメソッドでリストの最後に追加
>>> my_list.append('e')
>>> print(my_list)
['a', 'b', 'c', 'd', 'e']

>>> ### insertメソッドで指定した位置に追加
>>> my_list.insert(2,'good')
>>> print(my_list)
['a', 'b', 'good', 'c', 'd', 'e']

>>> ### removeメソッドで指定した要素を削除する（インデックス番号ではなく要素そのもの)
>>> my_list.remove('good')
>>> print(my_list)
['a', 'b', 'c', 'd', 'e']

>>> ### clearメソッドでリストを空にします
>>> my_list.clear()
>>> print(my_list)
[]

>>> ### countメソッドで引数で指定したものがリストの中にいくつあるか返します(エクセルのcountifみたいな）
>>> my_list = ['a', 'a', 'b', 'b', 'b']
>>> my_list.count('b')
3

```

* なんとなく使い方は分かってきた



## その他のリスト演算子

* リストはPythonで重要な型ということでメソッドを使わなくても簡単に操作できる仕組みがあります。
* in 演算子：リストにXXが含まれているかどうかを確認するもの

```python
>>>
>>> print('c' in my_list)
True
>>>
>>> print('x' in my_list)
False
>>>

```

* ん？急に変な書式。
* ある要素がリストに含まれているかどうかを確認する場合に使うようだ。
* 似たようなものでdel 、スライスというものがある

```python
>>> ### リストから3番目の要素を削除
>>> print(my_list)
['a', 'b', 'c', 'e']

>>> ### リストの1番目から4番目までを表示（4番目は含まない）
>>> my_list = ['a', 'b', 'c', 'd', 'e']
>>> b = my_list[1:4]
>>> print(b)
['b', 'c', 'd']

```



## 今回のまとめ

* とりあえず、オブジェクト指向が分からなくても、メソッドの使い方が分かればよいと思い、リストの扱い方を中心に整理してみました。
* この辺から進みが悪くなってきた。過去の内容も忘れてきてる。リストの扱い方とか忘れかけてる。。。。
* 次もオブジェクトの操作、今度は文字列。



## 名言・ライトニングトーク用

* 「オブジェクト指向」「概念」「ふるまい」こういった、言い回しがオブジェクト指向の敷居を高くしてるような。別の言い方は思いつきませんが。