【Python】クラスとオブジェクトの基本(1) – サンプルコード付

Python は他の多くのプログラミング言語同様にオブジェクト指向プログラミングの標準的な機能を備えています。Python(Python3)のクラスとオブジェクトの基本をサンプルコード付きで解説します。

公式ドキュメント
https://docs.python.org/ja/3/tutorial/classes.html

クラスとオブジェクトの実例

ECサイトで商品をカートに入れて合計金額を表示するための処理を例にサンプルコードを書いてみました。下記では商品クラス(Item)とカートクラス(Cart)の2つのクラスを定義、そのインスタンスオブジェクトを用いています。

実行結果は以下のようになります。

Github にこのページのソースコードをアップしています。
https://github.com/toksan/python3_study/blob/master/class/example_basic_1.py

Pythonのクラスの注意点(主に多言語経験者向け)

1. コンストラクタ・デストラクタ

コンストラクタは def __init__(self): となります。引数をもつ場合は def __init__(self, arg1, arg2): のように書きます。上記サンプルでは使用していませんが、デストラクタは __del__ というメソッドになります。

2. インスタンスメソッドの第一引数は必ず self

インスタンスメソッドを定義するとき最初の引数は必ず self にします。selfはインスタンス自身のことで、Java/JavaScript/PHPの this ($this)のようなものです(thisとは色々違いますが…)。

多言語経験者からすると毎回selfと書くのがめんどくさく感じるかもしれませんが、PyCharmのようなPython用のIDE / エディタ使用すれば自動補完・入力してくれます。

メソッドを呼び出して使うときには self に対応する引数は不要であることに気をつけましょう。たとえば def set_name(self, str): を呼び出すときは object.set_name(‘太郎’) のように引数は1つだけです。

なお、def_set_name(this, str): というふうに最初の引数を「self」でなくて「this」としても構文上は問題ありませんが、Pythonではselfにするのが一般的です。self ついて公式ドキュメントでは下記のように書かれています。

よく、メソッドの最初の引数を self と呼びます。この名前付けは単なる慣習でしかありません。 self という名前は、 Python では何ら特殊な意味を持ちません。とはいえ、この慣行に従わないと、コードは他の Python プログラマにとってやや読みにくいものとなります。また、 クラスブラウザ (class browser) プログラムがこの慣行をあてにして書かれているかもしれません。

https://docs.python.org/ja/3/tutorial/classes.htmlより引用

3. メソッド外で定義した変数

Pythonではメソッド外で定義した変数は(インスタンス変数ではなく)「クラス変数」になり、インスタンス間で共有されることに注意しましょう。他言語経験者はハマる可能性が大きいかと思います。

※上記サンプルスクリプトの Item.item_list が該当します。

インスタンス変数はコンストラクタ(__init__メソッド)でまとめて定義(+初期化)するのがよいでしょう。

4. アクセス修飾子はない!

private や protected などのアクセス修飾子はありません。原則 public となりますが、def __hoge(self):  のようにメソッドや変数の前にアンダースコアを2つつけると private 相当になり、インスタンスから直接アクセスできなくなります。(ただし、アクセスする方法があるので、他言語のprivateとは若干異なります。)

あとは慣習ですが、アンダースコア1つをつけると private 相当に扱うという暗黙のコーディングルールがあります。

オブジェクトの中からしかアクセス出来ない 「プライベート」 インスタンス変数は、 Python にはありません。しかし、ほとんどの Python コードが従っている慣習があります。アンダースコアで始まる名前 (例えば _spam) は、 (関数であれメソッドであれデータメンバであれ) 非 public なAPIとして扱います。これらは、予告なく変更されるかもしれない実装の詳細として扱われるべきです。

https://docs.python.org/ja/3/tutorial/classes.html より引用

5. new は不要

サンプルコードからもわかりますが、インスタンス化するにあたって new は不要です。返り値のある関数と同じシンタックスになります。


Python のクラスとオブジェクトの基本(1)は以上となります。Python(Python3) のクラス・オブジェクトは良くも悪くもカジュアルなので、変数名やメソッド名には注意する必要があるでしょう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です