![見出し画像](https://assets.st-note.com/production/uploads/images/114322657/rectangle_large_type_2_cbdfa5718d42ab250cd990192b4d4f5c.png?width=1200)
ノンプロ研 中級プログラミング講座【Pythonコース】第1期 追加講義 「オブジェクトとクラスその2」学習メモ
はじめに
ノンプロ研で開催されていた、「中級プログラミング講座【Pythonコース】」第1期は、全4回の講座でした。
次回開催に向け、カリキュラム見直しにより1回分講座が増えるとのこと。講座順としては、3回目に追加されます。
![](https://assets.st-note.com/img/1692947560740-mUscNqDkIL.png?width=1200)
今回、特別に第1期受講者の皆さん向けに、追加講義が開催されました。アジェンダは、「オブジェクトとクラスその2」。
今回は、この追加講座の内容と、学習したことをまとめていきます。
1. クラス変数とクラスメソッド
はじめに、第2回の内容、クラス、インスタンスの生成、インスタンス変数についてのおさらいから。
内容は、下記の記事にまとめています。
クラス全体で管理したい変数があるような場合、どう実装しますか?
![](https://assets.st-note.com/img/1692947731889-mMnedeNx2m.png?width=1200)
この例のPersonクラスの場合、生徒の出席番号、社員の社員番号など、クラス全体で番号を順番に振りたい、というケースに遭遇しますよね。
このようなケースで使用するのが、クラス変数です。
クラス変数
![](https://assets.st-note.com/img/1692947807159-dxxWwNAT9L.png?width=1200)
クラス全体に所属する変数のことを、クラス変数と言います。
クラス変数の作り方
![](https://assets.st-note.com/img/1692947827151-CPSu3pNmut.png?width=1200)
インスタンス変数とクラス変数の参照方法の違いは、下記の表のようになります。
![](https://assets.st-note.com/img/1692947914099-GH7s2JZXk8.png?width=1200)
クラス変数は、インスタンス変数同様クラスのインスタンスから参照可能です。インスタンス変数との違いは、クラスのすべてのインスタンスで同じ変数が共有されることです。
クラス変数の更新時の注意事項です。
クラスを更新する場合、クラスオブジェクトに対して代入を行います。
インスタンス変数に対して代入を行うと、新しいインスタンス変数として定義されます。
class Onigiri:
currency = 'Yen'
def __init__(self, name, price, stock):
"""コンストラクタ
Args:
name (str): 商品名(具)
price (int): 販売金額
stock (int): 在庫数
"""
self.name = name
self.price = price
self.stock = stock
def get_price_with_currency(self):
return f'{self.price} {self.currency}'
print(Onigiri.currency) # Yen
sake = Onigiri('sake', 130, 5)
print(sake.get_price_with_currency()) # 130 Yen
print(vars(sake))
sake.currency = 'Dollar'
print(sake.get_price_with_currency()) # 130 Dollar
print(Onigiri.currency) # Yen
print(vars(sake))
インスタンス内にある属性を確認するために、vars関数を使用しています。
実行結果を確認します。
![](https://assets.st-note.com/img/1692947977549-UbmsLwWgUb.png?width=1200)
1回目のvars関数の実行結果を確認すると、Onigiriクラスのインスタンスであるsakeオブジェクトには、name、price、stockの3つのインスタンス変数があることがわかります。
続いて、sakeオブジェクトのcurrency変数に代入します。
その後、2回目のvar関数の実行結果を確認すると、name、price、stock、currencyの4つのインスタンス変数があることが確認できました。
Orinigi.currencyを表示すると、YENのままなので、sake.currencyに代入してもクラス変数を更新することはできないことがわかります。
クラスメソッド
クラスメソッドとは、クラスに所属するメソッドのことです。
![](https://assets.st-note.com/img/1692948023995-8QrhiHvKBV.png?width=1200)
クラスメソッドの定義
![](https://assets.st-note.com/img/1692948059046-r3lKbpYSJ7.png?width=1200)
@classmethodデコレータをつけてからdef文を使って定義します。第1引数には、クラスオブジェクトを示す、clsを指定します。
クラスメソッドの第1引数、clsは、クラス自身のことを指す変数名です。
clsは予約語ではなく、慣習として使用されているクラスオブジェクトを表す定義です。
@classmethodは、デコレータと呼ばれる、関数やクラスの前後に処理を追加できる機能のことです。
![](https://assets.st-note.com/img/1692948118289-nXsngTFuQ5.png?width=1200)
インスタンスメソッドとクラスメソッドの呼び出し方法の違いは、下記の表のようになります。
![](https://assets.st-note.com/img/1692948159419-jzzBZ2MIzj.png?width=1200)
第1引数として渡される変数は、インスタンスメソッドの場合は、インスタンスオブジェクトであるのに対し、クラスメソッドは、クラスオブジェクトが渡されます。
おまけ
クラスで定義できるメソッドには、インスタンスメソッド、クラスメソッド以外に、静的メソッド(スタティックメソッド)があります。
静的メソッドは、クラスに所属するため、クラスメソッドと同じですが、異なる点は、下記となります。
@staticmethodデコレータを使用する
引数に、クラスオブジェクトは渡さない
2.特殊メソッド
特殊メソッドとは?
![](https://assets.st-note.com/img/1692948226454-HK1CXM2u43.png?width=1200)
Pythonが暗黙的に呼び出すメソッドのことです。メソッド名の前後にアンダースコア2つ(__)が付いていることから、ダンダーメソッドとも呼ばれています。
主な特殊メソッド
下記の表では、右側に記載されている標準関数や演算が呼び出されるタイミングで、どの特殊メソッドが実行されるのか?を表にしています。
![](https://assets.st-note.com/img/1692948249569-tgGuvKT69i.png?width=1200)
![](https://assets.st-note.com/img/1692948254338-0gmsVbUIB8.png?width=1200)
数値演算特殊メソッド
演算子(+、-、*、/)をオーバーロードしたい場合に使用する特殊メソッドです。
比較特殊メソッド
比較演算子(<=、>=、==、!=)をオーバーロードしたい場合に使用する特殊メソッドです。
3.エラーと例外
エラーの種類
Pythonには、下記の2種類のエラーがあります。
![](https://assets.st-note.com/img/1692948328844-PQfRLFMM3v.png?width=1200)
構文エラー(syntax error)は、正しい式、文ではない、つまりスペルミス、インデント指定ミスなどで発生するエラーです。
例外(exception)は、構文上は正しいけれども、実行時に発生するエラーとなります。
主なエラーの種類
![](https://assets.st-note.com/img/1692948362243-vvIA0kQF10.png?width=1200)
構文エラーが発生すると、VS Codeの場合、エラー発生個所のソースコードの行番号、エラー内容、エラー箇所が表示されます。
![](https://assets.st-note.com/img/1692948383687-pgBpmzd0YC.png?width=1200)
おまけ
VS Codeの拡張機能「Pylance」をインストールしていると、コード上に波線が表示され、構文エラーの内容が表示されるという機能があります。
![](https://assets.st-note.com/img/1692949451257-MM8zOlTnzv.png?width=1200)
![](https://assets.st-note.com/img/1692949652493-U3xQu8dAdf.png)
![](https://assets.st-note.com/img/1692949705669-bQ7FWIrbWt.png)
4.例外処理
例外
例外とは、プログラムが構文は正しいけれども、実行時に発生するエラーのことです。
Pythonでは、例外の発生を検知すると、プログラムの実行を強制的に終了し、発生個所の情報を出力します。
主な例外の種類
![](https://assets.st-note.com/img/1692949859266-qBewyL0Iza.png?width=1200)
![](https://assets.st-note.com/img/1692950025146-fRAwi0V4cz.png?width=1200)
例外発生時の主な対処法
対処方法として、下記が考えられます。
![](https://assets.st-note.com/img/1692950083015-H3j62EcRmm.png?width=1200)
利用するすべての人が、いつも同じ解決方法を望んでいるとは限りません。そのため、利用者側で例外が発生した場合にどう対処したいかを実装してもらうのが良い方法となるかと思います。
![](https://assets.st-note.com/img/1692950242494-VH2sa8tzRB.png?width=1200)
try文による例外処理
![](https://assets.st-note.com/img/1692950258986-yQzmpychgg.png?width=1200)
try文は、try節とexcept節で構成されます。
try節には、本来の処理を、except節には、例外が発生したときに行いたい処理を記述します。
なお、このexcept節は、複数記載することができます。例外に合わせた処理を分けることができるようになります。
例外処理の応用
![](https://assets.st-note.com/img/1692950321717-ez7ps09H1w.png?width=1200)
else節で、例外が発生しない場合の処理を記述できます。
また、finally節では、例外が発生しても、しなくても、最後の処理を実行するための処理を記述します。
演習で動作確認してみます。
def calc_numbers(a, b):
int_a = int(a)
int_b = int(b)
print(f'a / b は {int_a / int_b} です。')
try:
calc_numbers('10', '2')
except (ValueError, TypeError):
print('入力文字列が不正です')
except ZeroDivisionError:
print('0で割り算はできません')
else:
print('正常です')
finally:
print('終了します')
実行結果は、下記のように表示されます。
![](https://assets.st-note.com/img/1692950550697-QKHS014RfO.png?width=1200)
複数の例外が発生した場合、同じ処理を実行させたい場合には、タプルで指定することができます。
おまけ
下記のように、except節を実装します。
try:
print(5 / 0)
except:
print('エラーが発生しました。')
VS Codeでflask8の設定を行っていると、下記のように表示されます。
![](https://assets.st-note.com/img/1692952137715-Az8NiuRCyM.png)
do not use bare ‘except’とは、特定の例外をexcept節で指定しないで使用する際に表示されるエラーのことです。
特定の例外を指定しないexcept節の場合、全ての例外をキャッチしてしまい、Ctrl+Cでのプログラム中断をしにくくしてしまうとのこと。
そのため、PEP8では、警告として表示してるようです。
講座ツイートまとめ
講座では、記憶定着化のため、アウトプットすることが推奨されています。受講された皆様方のXへのポストまとめは、下記よりご参照ください。
まとめ
今回は、ノンプロ研 中級プログラミング講座【Pythonコース】第1期 追加講座「オブジェクトとクラスその2」について、講座内容と学習のメモまとめました。
目次
1.ノンプロ研 中級プログラミング講座【Pythonコース】第1期 第1回 「関数と式」学習メモ
2.ノンプロ研 中級プログラミング講座【Pythonコース】第1期 第2回 「オブジェクトとクラス」学習メモ
3.ノンプロ研 中級プログラミング講座【Pythonコース】第1期 第3回 「モジュール」学習メモ
4.ノンプロ研 中級プログラミング講座【Pythonコース】第1期 第4回 「ファイル操作とAPI」学習メモ