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)
* [Python はじめから勉強 Hour4：オブジェクト指向①](https://qiita.com/matsumo2019/items/b4e083b804590fcdf0d1)



## 環境

* Windows
* Python Ver3系



## 不変オブジェクト

* 前回はリストオブジェクトを操作しました。メソッドとしてはインスタンスそのものを変更することができました（リストの最後に値を追加する など）
* そういったものとは別に「絶対にインスタンスが持つデータが変わらない」というものがあり、その代表が文字列型となります。



## 不変オブジェクトの操作

* 文字列型のメソッドは自身のインスタンスを変化させることはありません。
* メソッドを使用してもオブジェクトは変化しない 例

```python
>>> my_str = 'hello Python!!'
>>> my_str2 = my_str.upper()
>>>
>>> ### 元々の値を表示
>>> print('Original: ', my_str)
Original:  hello Python!!             ### 変化してないことが確認できる
>>>
>>>
>>> ### 文字列操作後の値を表示
>>> print('Return my_str2: ', my_str2)
Return my_str2:  HELLO PYTHON!!


```

 * メソッドを呼び出したインスタンス（my_str)が、メソッドを呼び出した後も変化していないということが確認できました。
 * 文字列を置き換えるreplaceメソッドでも同じです。

```python
>>> my_str = 'hello Python!!'
>>> my_str2 = my_str.replace('hello', 'kill')
>>>
>>>  ### 元々の値を表示
>>> print('Original: ', my_str)  
Original:  hello Python!!                 ### 変化していないことが確認できる
>>>
>>>
>>> ### 文字列操作後の値を表示
>>> print('Return my_str2: ', my_str2)
Return my_str2:  kill Python!!

```

 * replaceメソッドなんて、インスタンスを変化させそうな感じですが、「文字列型のメソッドは、元のインスタンスを変化させることはない」ということを覚えておけば混乱しないですね。



## 文字列型の インスタンス のメソッドで遊んでみる

* Pythonのプログラミングで文字列操作は頻繁に使われるのでいろいろ試してみる

```python
>>> ### formatメソッド。文字列結合でお世話になるやつ
>>> in_name = 'Pochi'              ### 変数で名前と年齢を指定する
>>> in_age  = 3
>>>
>>>### {}の中に変数の値を挿入する。これはオシャレなメソッド
>>> my_text = 'My name is {}. {} years old.'.format(in_name, in_age)
>>> print(my_text)
My name is Pochi. 3 years old.
>>>

>>> ### startswithメソッド。文字列の先頭があるかを確認。bool型で True/Falseがかえってきます。
>>> print('AHV-log:aaa'.startswith('AHV'))　　　　　###ログに先頭にログファイル名などあれば使いやすそう
True
>>> print('mail-log:aaa'.startswith('AHV'))
False

>>> ### endswithメソッドも同じ使い方


>>> ### stripメソッド。文字列前後の空白を取り除く
>>> print('  aaa    ') 
  aaa
>>> print('  aaa    '.strip())
aaa　　　　　###前後の空白が取り除かれている。アホなログファイルとかを扱う時に便利
>>>

>>> ### splitメソッド。カンマ区切りなどでデータを取り出すとき。JSONとかで使えそう
>>> my_text ='aaa,bbb,ccc'
>>> my_list = my_text.split(',')    ###カンマで分割
>>>
>>> print(my_list)
['aaa', 'bbb', 'ccc']
>>>

>>> ### joinメソッドで結合（リストではなくテキストオブジェクトのメソッドで実行していることに注意）
>>> my_list = ['aaa', 'bbb', 'ccc']
>>> print(','.join(my_list))
aaa,bbb,ccc         ###リストをカンマ区切りにできました
>>>

>>> ### 文字列比較 in演算子（文字列 Aが文字列Bに含まれているか）。条件式で使いそうですね
>>> print('aaa' in 'aaaaaaa')
True
>>> print('aaa' in 'baaaaaa')
True
>>> print('aaa' in 'aaabbbaaa')
True
>>> print('aaa' in 'ccc')
False
>>>

```

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



## メソッドのチェーン

* メソッドの戻り値のインスタンスに対してメソッドで操作することも可能です（例を見た方が早い

```python
>>> my_name = 'pochi'
>>> my_intro = 'My name is {}.'.format(mnname)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'mnname' is not defined
>>> my_intro = 'My name is {}.'.format(my_name)
>>> my_intro.upper()
'MY NAME IS POCHI.'      ###これだけかかる処理が
>>>


>>> my_name = 'pochi'
>>> print('My name is {}.'.format(my_name).upper())
'MY NAME IS POCHI.'　　　　###1行でできる
>>>

```

* 上記のように省略できるけど、ほどほどに。可読性が悪くなります。

  

## 今回のまとめ

* 文字列は可変のオブジェクトですのでそれを理解して使いましょう

* これだけの量でもしっかり確認しながらすると1時間かかる。そろそろ7時間過ぎたなｗ

  

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

* 可読性を高めるために関数やメソッドを使うけど、使い過ぎると可読性、メンテナンス性が低くなる。