Masayan tech blog.

  1. ブログ記事一覧>
  2. pythonにおけるselfの正体について

pythonにおけるselfの正体について

公開日

環境

  • Windows 10
  • Python 3.10.1
  • VSCode

大前提

selfのきほん

  • プログラミングでは、多くの言語において、そのクラス自身を指す時にselfを使用します。
  • pythonでも、クラスを用いたオブジェクト指向の開発を行う際、漏れなくselfに直面することになります。

コード例

以下はパス文字列を受け取り、何かしらのパスを管理するクラスの例です

shared\Domain\xpath.py

class XPath:
    def __init__(self, path: str):
        self.path = path
    ...

関数の型

関数の型はその定義のされ方により型が以下のように異なる

  • クラスに定義したインスタンス化を伴う関数
    method型
  • クラス以外に定義した関数やインスタンス化を伴わない関数
    →function型

本題

pythonにおけるselfは何か

結論からですが、基本的には他の言語と同様、自身のクラスを指します。また、クラス内のプロパティやメソッドにアクセスする際、self.プロパティ名や、self.メソッド名として参照するとが可能です

コード例

class XPath:
    def __init__(self, path: str):
        self.path = path

    def get_path(self):
        return self.path # self.プロパティ名でアクセスが可能

また、インスタンス化されたオブジェクトから呼び出されることを前提としたmethodについては

  • 引数にselfを指定する必要がある
  • methodは呼び出し時に引数にそのオブジェクト自身を渡す必要がある。
    • 呼び出し側は引数のselfを省略できる
    • 呼び出される側は、デフォルトで1つ引数(self)を設定する必要がある
  • インスタンス自身を指す変数には習慣としてselfが使われる(実はselfでなくても可能)

コード例

class XPath:
    def __init__(self, path: str):
        self.path = path

    def get_path(self): # 引数にselfを指定
        return self.path

XPath("/hoge/foo/bar.txt").get_path() # 呼び出す際はselfを省略可能

指定しない場合、以下のようなエラーが生じます。※ただしstatic関数として定義した場合は除く。(@staticmethodのデコレーター)

method1() takes 0 positional arguments but 1 was given
直訳:1つの引数が必須ですが、0個しか渡されていません

コード例

shared\Domain\xlist.py

class XList:
    @staticmethod
    def map(callable, iterable): #staticmethodであれば、呼び出し時にselfがなくてもエラーにならない
        return list(
            map(
                lambda item: callable(item),
                iterable,
            )
        )

コンストラクタ

pythonでは、コンストラクタは__init__を使用して記述します。

コード例

class XPath:
    def __init__(self, path: str):
        self.path = path

initは、インスタンス化するために最初に必ず呼び出される特殊なメソッドであり、method型であるため、引数にselfを取る必要があります。

まとめ

いかがでしたでしょうか。本記事では、pythonにおけるselfの特徴や使い方について紹介しています。ぜひ参考にしてみてください。