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

環境

  • Windows 10
  • Python 3.10.1
  • VSCode

使用するソースコード

以下の公開リポジトリに置いています

GitHub - masayan1126/tao-py-py: 作業自動化用 Python ライブラリ
作業自動化用 Python ライブラリ. Contribute to masayan1126/tao-py-py development by creating an account on GitHub.

大大大前提

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学習におすすめの書籍

独習Python/山田祥寛【3000円以上送料無料】
bookfan 1号店 楽天市場店
¥ 3,300(2023/01/31 18:22時点)
タイトルとURLをコピーしました