スライドショー

Pythonのselfとは?使い方や注意点について解説

今日は、Pythonのクラスを勉強する際に必ず登場するselfについて説明します。Pythonにおいてしばしばヘイトを集めていると言われているselfですが、今回はその役割について理解を深められればと思います。

Pythonのselfって何?
selfの使い方を知りたい!
selfって消すことはできないの?

といったselfに初めて触れる方へ向けて、今回の記事では

  • 【基礎】selfとは?
  • 【基礎】selfの使い方
  • 【発展】self参照の注意点

について説明します。クラスやselfについて初心者の方でもわかるように解説していますので、selfの役割をしっかりと理解しておきましょう!

※ この記事のコードはPython 3.7, Ubuntu 18.04で動作確認しました。

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ライフを送ってください!

LINEで送る
Pocket

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

遠藤貴大

遠藤貴大

1991年生まれ。双子座。
理系大学で認証システムを学んだ後、アプリ開発者となる。
新しく学ぶ人に寄り添った記事を心がけて執筆します。
芸術が好き。いつか猫と暮らすのが夢。