PythonとRubyのクラスの継承を学習して、子どもの自立を見守る大人になりたいと思った話

#今回書くこと
今回は技術的なことはほとんど喋りません。緩めです。お許しください。

さて、Pythonの学習を一昨日くらいに始めまして

とりあえずお馴染みのProgateやってみようと思い

さっき、Ⅰ~Ⅴまで、やり終えました。
Rubyの知識があったのでほとんど「Rubyでやったところだ！」と思いながら、学習していた感じです。

##クラスとは
さて、**クラス**という概念をご存知でしょうか。Python, Rubyといったほとんどの言語で採用されている概念であり、**オブジェクト指向の言語**には必ずと言っていいほど存在します（しない言語もあります。）

クラスは、よく設計図と呼ばれたりします。

Pythonだとこんな感じです。(細かいところは、Progateをやれば絶対わかるのでぜひそちらで。)


```dog.py
class RobotDog:

  def __init__(self, type):
    self.type = type

  def cry(self):
    print("ワン！")

```

こんな感じで、もし犬のロボットを作る時に、設計図として`RobotDog`クラスを作っておけば、

```dog.py
class RobotDog:

  def __init__(self, type):
    self.type = type

  def cry(self):
    print("ワン！")

robot_dog1 = RobotDog("ラブラドールレトリバー")   #ラブラドールレトリバーの形をしたロボットドッグ1号を作りました。

```
このようにして、ロボットドッグを実際に作ることができたり

```dog.py
class RobotDog:

  def __init__(self, type):
    self.type = type

  def cry(self):
    print("ワン！")

robot_dog1 = RobotDog("ラブラドールレトリバー")   #ラブラドールレトリバーの形をしたロボットドッグ1号を作りました。
robot_dog1.cry()         #ロボットドッグ1号に「”ワン！”」と鳴いてもらいました。
print(robot_dog1.type)   #→ラブラドールレトリバー

```
とすることで、作ったロボットドッグ1号にワン！と鳴かせることも可能になります。

このように、クラスは設計図のようなものであり、言い換えれば
**`生みの親`**とも言い換えることができます。

##クラスの継承
さて、なんとなくクラスが分かってもらえたでしょうか。

>クラスは、生みの親

でも、その**クラスの中にも親子関係が存在します**。

こんな感じです。

```robot.py
class Robot:
  def __init__(self, parts, engine):
    self.parts = parts
    self.engine = engine

```
こういう風に、`RobotDogクラス`の親となる`Robotクラス`を作ります。

そしたら、先ほどのRobotDogクラスに**継承**を行います。

```dog.py
from robot import Robot  #このように、Robotという親となるクラスを呼び出し

class RobotDog(Robot):  #Robotクラスを継承させることができます。

  def __init__(self, type):
    self.type = type

  def cry(self):
    print("ワン！")

robot_dog1 = RobotDog("ラブラドールレトリバー")   #ラブラドールレトリバーの形をしたロボットドッグ1号を作りました。
robot_dog1.parts = "足が4本"
robot_dog1.cry()         #ロボットドッグ1号に「”ワン！”」と鳴いてもらいました。
print(robot_dog1.type)   #→ラブラドールレトリバー
print(robot_dog1.parts) #→足が4本
```
こうすることで、クラスに親子関係を作り、子は親のインスタンスメソッドと呼ばれる機能（`def~`から始まっている塊）を利用できるようになります。

##人間の親子も
さて、なんとなくクラスと、クラスの継承について理解していただけたでしょうか。

ひとまずここまでをまとめると

> 1. クラスは、設計図である。
> 2. クラス同士で、親子関係を作ることができる。

と理解していればOKです。

僕はこの時ふと思いました。

####これって、人間のやっていることだよな...

例えば、親は子に箸の持ち方を教えますよね。これは、**「箸の持ち方を、継承している」**のではないでしょうか。

というか、親は大半のことを、子どもに「継承」しているはずです。それが一つの教育だと思います。

しかし、子どもは環境や必要に応じていろいろな形に変化しますよね。

これも実は、**プログラミングで実際に行われることだったりします**。

##オーバーライド
プログラミングでは、これを**オーバーライド**と言います。

実際には、このように行います。
まず、親の`Robotクラス`に`soundインスタンスメソッド`を追加します。

```robot.py
class Robot:
  def __init__(self, parts, engine):
    self.parts = parts
    self.engine = engine

 def sound(self):
    print("ウィーン")
```
`def sound(self)`と書かれているところがそれに該当します。

そして、継承済みの`RobotDogクラス`で、呼び出しを行います。

```dog.py
from robot import Robot

class RobotDog(Robot):

  def __init__(self, type):
    self.type = type

  def cry(self):
    print("ワン！")

#(中略)

robot_dog1.sound()  #ウィーン

```

しかし、これを子どもの方だけで変更することが可能です。

犬の稼働音がウィーンだと怖いので

```dog.py
from robot import Robot

class RobotDog(Robot):

  def __init__(self, type):
    self.type = type

  def cry(self):
    print("ワン！")

  def sound(self):
    print("タッタッタ")

#(中略)

robot_dog1.sound()  #タッタッタ

```
と言う風に、犬の足音風にしてあげました。この時、元々の「ウィーン」は親の方で変更されません。

####つまり、子どもは必要に応じて変化することができます。しかも、本質的には親に影響を与えたりしません。

これはプログラミングの話ですが、プログラミング言語を作ったのも人間です。

プログラミングの仕組みを考えた方はどう思っていたかわかりませんが、

僕は、こう言う解釈の仕方があっても良いんじゃないかなと思いました。

##子どもの自立を見守る大人になりたいと思った
ぼくは結婚もしてないし、子供もいません。
それでも、至る所に教育は存在し、根幹となります。大切なことではないかと思います。

####クラスの親子関係のように、子供が変化する様子を見守れる大人になりたい。

今回は、ちょっとポエってみました。

##最後に
最後まで読んでいただき、ありがとうございます。
ソースコード、記事の書き方について「もっとこうしたほうがいいよ！」というご意見、「そこどうなっているの？」というご質問など、お待ちしております。