🎙️

【Python】classmethodからプライベートのメソッドを呼び出したい

2022/08/03に公開

概要

Pythonではインタンス化していないクラスから呼び出されるメソッドである、classmethodの機能があります。classmethodの詳細はPythonのクラスメソッド(@classmethod)とは?使いどころとメソッドとの違いを解説の記事を参照ください。
今回はこのclassmethodからプライベートで設定したメソッドを呼び出す場合、どうすれば良いのかというのをメモ書きします。

対応

classmethodでは自クラスを表すclsを引数に取ります。このclsから、プライベートメソッドを呼び出すことが出来ます。プライベートメソッドを呼び出すときは自身(cls)を引数に設定します。
なお、プライベートメソッドの詳細についてはPython のクラスで private メソッドを定義するの記事を参照ください。

実装サンプル

以下のような、東証の市場を表すclassの実装をサンプルとして記します。
classmethodであるmake_market_from_nameからプライベートのメソッド__get_code_from_nameを呼び出しています。

class Market:
    __market_dict = {'prime': 'プライム', 'standard': 'スタンダード', 'growth': 'グロース'}

    def __init__(self, market_code, market_name):
        self.code = market_code
        self.name = market_name

    @classmethod
    def make_market_from_name(cls, market_name):
        # プライベートメソッドを呼び出す箇所
        market_code = cls.__get_code_from_name(cls, market_name)
        return cls(market_code, market_name)

    def __get_code_from_name(self, market_name):
        market_code = ""
        for code, name in self.__market_dict.items():
            if market_name.startswith(name):
                market_code = code
                break
        return market_code

Discussion