Python入門7

入門編の第7回目となります。

Aidemyさんの講座を受講しながらアウトプットのためにブログを更新しております。

AidemyさんHP → https:// aidemy.net

今回はクラス・オブジェクトについて説明していきます。

【オブジェクト】

Pythonはオブジェクト指向言語です。

突然言われてもという話だと思いますので、簡単に書きますと、、、
プログラミングのスタイルには3種類ある様で
・手続き型プログラミング
・関数型プログラミング
・オブジェクト指向プログラミング

その中でオブジェクト指向プログラミングに該当するのがPythonの様です。
今回では他2つの型については省略致します。
オブジェクトとは、データやそのデータに対する手続き(メソッド)を一つにまとめたものを言います。オブジェクトのイメージとしては設計図です。オブジェクトをインスタンス化(実体化)して、メッセージ(命令)を送ると処理が行われます。
処理対象をオブジェクトとして捉え、それをモジュール化することでプログラムを再利用するやり方のことをオブジェクト指向と言います。
具体例を探していると下記のような文言がありましたので記載します。
(HEADBOOSTさんのブログから転載させていただきました)
バッグの中に、リンゴがいくつも入っているとします。
1 つ 1 つのリンゴが、それぞれオブジェクトです。それぞれのリンゴには、糖度や重さ、色といった共通の「属性」があります。そこで、オブジェクト指向プログラミングでは、リンゴクラスというものを作って、1 つ 1 つのリンゴが共通して持っている属性を、インスタンス変数として定義します。
ただし、糖度がどれぐらいか、重さが何グラムかというような「値」は、それぞれ異なりますね。そこで、リンゴというクラスから、1 つのリンゴ(インスタンス)を作る時に、値を与えます。
例えば、 Apple というクラスがあるとします。そして Apple クラスには、重さと色という共通属性があるとします。そこで、この共通属性を、weight と color という変数にします。

参考コードを下記に記載しますと、、、

class Apple:
   def __init__(self, w, c):
       self.weight = w
       self.color = c

Apple クラスのオブジェクトには、重さ (self.weight) と、色 (self.color) という変数を設定してます。

オブジェクト指向プログラミングでは、全てのオブジェクトを、このクラスから作ります。クラスから作ったオブジェクトのことを「インスタンス」と言います。そして、インスタンスを作る時に、あらかじめクラスで設定した変数に、値を渡します。

【クラス】

クラスは、オブジェクトの構造の設計図のようなものです。

画像1

上記のappleで説明すると、



イニシャライザは、クラスからインスタンスが生成された直後に実行される処理のことです。「__init__()」で作ると構文(基本一度)で決まっています。

メソッドについては後ほど説明します。

メンバ変数はクラス内で使用する変数のことです。

用語の定義を理解するよりも、例文からそれぞれの役割をイメージする方が理解が早いかもしれません。

例文

class MyProduct:  #クラス(先頭が大文字)を定義
   def __init__(self, name, price):  # イニシャライザを定義(第一引数をself)
       self.name = name  # 引数をメンバに格納
       self.price = price
       self.stock = 0 # stock, salesは0で初期化
       self.sales = 0

次に、定義したクラスからインスタンスを生成しましょう。 インスタンス生成では、クラス(MyProduct)を呼び出して変数に代入します。

# MyProductを呼び出し、product1を作成
product1 = MyProduct("cake", 500)
print(product1.name) # product1のnameを出力
> 出力結果
cake
print(product1.price) # product1のpriceを出力
> 出力結果
500
print(product1.stock)
> 出力結果
0

【クラスで定義できるメソッド】

通常のメソッド ... 第一引数がselfになります。
クラスメソッド ... クラス全体の操作を行います(クラス名.メソッド名で呼び出すことが可能)
スタティックメソッド(静的メソッド) ... 引数がなくても実行できる(メソッドの一番上に@staticmethodと付けることで定義できる)

商品の名前を返す: get_name() # メンバへのアクセッサ
商品をn個仕入れ、在庫を更新する: buy_up(n) # 仕入れメソッド
商品をn個販売し、在庫と売上げを更新する: sell(n) # 販売メソッド
商品の概要を出力する: summary() # 概要メソッド

class MyProduct:
   def __init__(self, name, price, stock):
       self.name = name
       self.price = price
       self.stock = stock
       self.sales = 0
   def get_name(self): # メンバへのアクセッサ
       return self.name
       
   def buy_up(self, n): # 仕入れメソッド
       self.stock += n
   def sell(self, n): # 販売メソッド
       self.stock -= n
       self.sales += n * self.price
   def summary(self): # 概要メソッド
       message = "called summary()." + \
       "\n name: " + self.get_name() + \
       "\n price: " + str(self.price) + \
       "\n stock: " + str(self.stock) + \
       "\n sales: " + str(self.sales)
       print(message)

【クラス:継承】

継承(インヘリタンス):この仕組みを利用することで、既存のクラスをコピーしたり、直接上書きしたりすることなく、メソッドやメンバの追加や上書きが可能となります。

オーバーライド:継承したクラスで継承元のクラスのメソッドを上書きすること

継承元となるクラスを親クラス、スーパークラス、基底クラス、継承先のクラスを子クラス、サブクラス、派生クラスと呼びます。

例文:MyProductを継承し、消費税10%の対応を追加し「MyProductSalesTax」を作成

# 親クラス
class MyProduct:
   def __init__(self, name, price, stock):
       self.name = name
       self.price = price
       self.stock = stock
       self.sales = 0
   def buy_up(self, n): # 仕入れメソッド
       self.stock += n
           
   def get_name(self): # 商品名メソッド
       return self.name
   def sell(self, n): # 販売メソッド
       self.stock -= n
       self.sales += n * self.price
   def summary(self): # 概要メソッド
       message = "called summary().\n name: " + self.get_name() + \
       "\n price: " + str(self.price) + \
       "\n stock: " + str(self.stock) + \
       "\n sales: " + str(self.sales)
       print(message)

継承の手順は下記の通りです。
super()で親クラスのメソッドを呼び出すことができます。

# MyProductクラスを継承してMyProductSalesTaxを定義
class MyProductSalesTax(MyProduct):
   # イニシャライザの第四引数に消費税率を設定
   def __init__(self, name, price, stock, tax_rate):
       #親クラスのイニシャライザを呼び出す
       super().__init__(name, price, stock)
       self.tax_rate = tax_rate
   # MyProductのget_nameを上書き
   def get_name(self):
       return self.name + "(税込)"
   #get_price_with_taxを追加
   def get_price_with_tax(self):
       return int(self.price * (1 + self.tax_rate))

このプログラムを実行すると下記のようになります。

product_3 = MyProductSalesTax("phone", 30000, 100, 0.1)
print(product_3.get_name())
print(product_3.get_price_with_tax())
# MyProductのsummaryメソッドを呼び出す
product_3.summary()
出力結果
phone(税込) # 期待通りの出力
33000    # 期待通りの出力
called summary() # priceが税抜き価格になってしまっています!
name: phone
price: 30000
stock: 100
sales: 0

理解不足な部分が多くあるので、後で理解が深まったところでもう少しわかりやすく書きます。

今回は以上となります。

お読みいただきありがとうございました。

この記事が気に入ったらサポートをしてみませんか?