今日は、Pythonのクラスを勉強する際に必ず登場するselfについて説明します。Pythonにおいてしばしばヘイトを集めていると言われているselfですが、今回はその役割について理解を深められればと思います。
selfの使い方を知りたい!
selfって消すことはできないの?
といったselfに初めて触れる方へ向けて、今回の記事では
- 【基礎】selfとは?
- 【基礎】selfの使い方
- 【発展】self参照の注意点
について説明します。クラスやselfについて初心者の方でもわかるように解説していますので、selfの役割をしっかりと理解しておきましょう!
※ この記事のコードはPython 3.7, Ubuntu 18.04で動作確認しました。
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
Pythonのselfとは?
そもそもクラスとは?
selfの解説に入る前にクラスについておさらいしておきましょう。
オブジェクト指向におけるクラスとは、オブジェクトを生成するうえで使われる型のようなものです。クラスの作り方は、classキーワードの後に任意のクラス名を書き、その下にメソッドや変数を書いていくことで作られます。
まずはじめに、空のクラスを作成し、そこからインスタンスを生成してみましょう。
class className(): pass # 何もしない instance = className()
もちろん何も処理が入っていないので、実行しても何も表示されません。ここで、クラスの中で”Hello World!”を表示するメソッドを入れてみましょう。メソッドは、クラスと同じ要領で”def”キーワードの後にメソッド名を入れ、そこに引数を与えます。
※メソッドとは、簡単に言うとクラスの中で定義された関数のことです。
以下のコードは、生成したインスタンスを使って”methodName”という名前のメソッドを呼び出したものです。
class className(): def methodName(self): print("Hello World!") instance = className() instance.methodName()
こちらを実行すると、
Hello World!
と表示されました。ここで記述したメソッドの引数として、”self”が登場します。以降では、このselfの役割から使い方、注意点までを順を追って解説していきます!
なお、クラスについては以下の記事でも詳しく解説しています。
selfとは?
上述のように、クラスの中のコンストラクタやメソッドには、selfというものが存在します。このselfは、インスタンス自身を示すものです。
また、selfはpythonの設計仕様で欠かすことはできません。なお、名前を”self”以外のキーワード(例えば、myselfなど)にすることは可能ですが、慣例としてselfを使用しています。
pythonでは作成されたコードを後から読む人が、どのように実装されているかが一目でわかるように書く事が重要である為、基本的には”self”とするのが良いでしょう。以降では、selfがどのように使われるかを確認します。
selfの使い方
インスタンス変数として参照する
まずはじめに、コンストラクタで使用する例を見てみましょう。pythonにおけるコンストラクタは”__init__”と表記します。
class className(): def __init__(self, strA, strB): self.strA = strA self.strB = strB test = className("Hello", "World!") print(test.strA) print(test.strB)
このように実装すると、以下のような結果を得られます。
Hello World!
このように、インスタンスを生成する際に引数を渡すと、selfを使ってインスタンス変数として代入する事ができます。この時に確認していただきたい点は、selfはインスタンス自身を示すものなので、呼び出す側は引数として値を入れない事です。
また、”__init__”のように__で囲まれた関数や変数は特殊な機能をもったものです。発見したら注意しましょうね。
クラス変数として参照する
また、以下のようにクラス変数として別メソッドでも使う事ができます。
class className(): def __init__(self, strA, strB): self.strA = strA self.strB = strB def output(self): print(self.strA) print(self.strB) test = className("Hello", "World!") test.output()
実行結果は、先ほどと同様です。
クラス継承の際も使える
selfはクラス変数として参照する事ができるので、クラスを継承した際にも参照する事ができます。
class classA(): def __init__(self): self.strA = "Hello World!" class classB(classA): def output(self): print(self.strA) test = classB() test.output()
実行結果:
Hello World!
selfの注意点
一点だけselfで注意していただきたい点があります。以下のコードをご確認ください。
# -*- coding: utf-8 -*- class cls(): strA = "Hello python" def __init__(self): print("1: " + self.strA) self.strA = "Hello World!" print("2: " + self.strA) strA = "Hello python" print("3: " + self.strA) test = cls()
これらを実行すると、何が表記されると思いますか?実行結果は以下になります。
1: Hello python 2: Hello World! 3: Hello World!
予想に反した結果だと思った方も多いのではないでしょうか?まず1について、”self.strA”はクラス内で定義したクラス変数”strA”と同じ意味を持っている為、参照エラーとはなりません。
続いて2について、こちらはインスタンス変数として”self.strA”が代入されたので、このような結果となります。そして3番、こちらは最後に代入された”Hello Python”が表示されない点に疑問を感じられませんか?
実はこれ、pythonの仕様なのです。pythonは、クラス変数もインスタンス変数も”self.変数名”という表記で参照できるのですが、クラス変数にもインスタンス変数にも値がある場合は、インスタンス変数を優先して参照します。
誤った値の参照とならないよう、注意しましょう。
まとめ
いかがでしたでしょうか?今回の記事では、
- selfとは?
- selfの使い方
- selfの注意点
を紹介致しました。selfは明示的に引数にしないといけない為しばしば面倒くさいという意見があるようですが、割り切ってしまえば便利に使う事ができます。
pythonのルールとして必要である事を理解して、快適なpythonライフを送ってください!
なお、今Pythonを学習している方は以下の記事もどうぞ。
はじめてPythonを使う方でもわかりやすいように、Pythonでできることやその学習法などを中心にまとめています。
復習にも使えると思いますので、ぜひ一度ご覧になってみてくださいね。
【Python 入門完全攻略ガイド】