40のおっさんのPython学習記録

20年以上前、学部の必修のC言語が全く理解できずに同級生に放り投げ、その後コーディングから遠ざかったガチ文系のおっさんが、ふと思い立ってPythonに挑戦しています。

用語がわけがわからん(オブジェクト、インスタンス、アトリビュート)

まず「オブジェクト指向」、おのれや。そうや、今日もおっさん、エセ関西弁ということは、わけがわからんなってイライラしとる、そういうわけや。オブジェクトって言葉がえらい曖昧な何を指してるのやらわからん上に「指向」なんてこれまた曖昧な言葉がついとる。指向ってことはほな何か、別にオブジェクトせんでもええわけか。どう言うわけやコラ、おっさんに言うてみいや。
おっさんはその昔N88 BASICでベーマガを写経し、HyperTalkでスタックを書き、AppleScriptMacの操作を自動化し、Cで爆死した。おっさんのそういう言語経験からすると、オブジェクト指向と言われてもさっぱりわからん。Wikipediaを見てもおっさん憤死しそうになるくらい意味がわからん。そこで、Weblioを見たら比較的わかりやすくこう書いてある。

オブジェクト指向プログラミングにおいて,内部構造をもつデータ。いくつかの内部データと,その内部データを操作する方法をひとまとまりにして管理したものをいう。データの利用方法が統一化されるので,再利用可能なプログラムが記述可能になり,大規模なプログラム開発が容易になる。 → オブジェクト指向プログラミング

これならまだわかる。なんか要するに、なんかデータとか、プログラミングの構成要素を部分部分として扱おうって話なんやな。なんやおっさんわかってきたで(いや、わかってない)。
そして「オブジェクト」とはナンジャラホイということになるんやが、わしが今リファレンスにしとるみんPyでは、オブジェクトはデータとメソッドを合わせたものということになっとる。つまりは、オブジェクトとは、データに加えて、そのデータに対して施すことが可能な処理も含めたもの、ということか。その処理をメソッドと言うと。

次はお前らや。

クラスとはオブジェクトの設計図にあたり、オブジェクトがどのように振る舞うのかという性質を記述したもの、ということ。

インスタンスとはクラスという設計図に基づいて作られたもの。オブジェクトと同じくデータと可能な処理、メソッドを含んでいる。
クラスからインスタンスを作るという流れ、関係をまとめたのが以下のコード。

from from decimal import Decimal # 10進数を取り扱うDecimalクラスを呼び出す
number=Decimal(10)          # Decimalクラスから10進数の数値のインスタンスを作成
print(number)
print(number+20)            # Decimalクラスのインスタンスは数値と同様に定義されているので数値演算可能
print(number.sqrt())        # Decimalクラスに含まれるメソッドで平方根を取得

アトリビュートとは変数のようなもの。”インスタンス名.アトリビュート名”のようにインスタンスに続いてドットで区切って記す。”クラス名.アトリビュート名”で、アトリビュートを後でクラスに追加したり、変数を変更したりすることができる。

class Prism:
    def __init__(self,width,height,depth):         #初期化メソッドを定義
        self.width  = width                          #幅アトリビュートを追加
        self.height = height                         #高さアトリビュートを追加
        self.depth  = depth                          #奥行アトリビュートを追加
    def result(self):                              #体積の計算
        return self.width * self.height * self.depth
#上記クラスではアトリビュートは記述されたが各アトリビュートの初期値は記述されていない

p1 = Prism(10,15,20)                             #p1インスタンスを作成
print(p1.result())                               #Prismクラスを利用してp1の体積を計算
print(p1.height)                                 #p1の高さアトリビュートを表示
p1.height=50                                     #p1の高さアトリビュートを変更
print(p1.result())                               #高さアトリビュート変更後の体積を計算
p1.bottom = p1.width * p1.depth                  #底面積アトリビュートを追加
print(p1.bottom)                                 #底面積アトリビュートを計算

以下の新アトリビュートbarに定義したメソッドfooを代入して新しいメソッドを作ることもできる。

class Atomklass:
    def foo(self): #メソッドfooを定義
        print("this is foo method!")

i1=Atomklass()  #i1インスタンスを作成
i2=Atomklass()  #i2インスタンスを作成
print(i1.foo()) #"this is foo method!"が表示される
i1.bar=i1.foo   #メソッドを新しいアトリビュートに代入
print(i1.bar)   #"this is foo method!"が表示される
print(i2.bar)   #こっちはエラー