Java/Python 導入ガイド:《余録》staticmethod/classmethod

記事一覧入門編基礎編応用編中級編

Java プログラマーのための Python 導入ガイド〈初級/入門編〉《Jython2.5》
《余録》staticmethod/classmethod

《著》小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/23 ● 第2版♪2009/04/03

■ 概要

Java™ Programming Language〔JPL〕の事例を使って、JavaJython との違いを学びます。

世界一有名かつ短いプログラム

■ 事例:

メソッド呼び出しのときに割り当てられる(実行時に確定する)引数 self を介して、インスタンスやクラスの情報を参照できます。

class HelloWorld:
    def main(self):
        print("Hello, world")
        print(self.__class__.__name__)

>>> HelloWorld().main()
Hello, world
HelloWorld

特殊属性 __class__ を介して、インスタンスが属するクラスを参照できます。
特殊属性 __name__ を介して、クラスの名前を参照できます。これは、クラスを定義したときの class に続く識別子(文字列)と同じものです。
メソッド呼び出し main() に呼応するのは、生成したばかりのインスタンス HelloWorld() です。すると、メソッド本体に記述したコードの断片を実行します。

■ 事例:staticmethod

Python2.2 以降では、staticmethod を利用できます。

class HelloWorld2:
    @staticmethod
    def main():
        print("Hello, world")

>>> HelloWorld2.main()
Hello, world

メソッド呼び出しのときに割り当てられる引数はありません。その代わり(インスタンスを介さずに)クラス名を伴うメソッド呼び出しが可能になります。
メソッド呼び出しに呼応するのは、クラスの属性 main です。メソッド HelloWorld2.main は、呼び出し可能オブジェクト(callable)なので、それに呼び出し演算子()を適用しているだけなのです。そのため、メソッド呼び出し main() に呼応するのは、(メソッド定義を含む)クラス HelloWorld2 と見なすこともできます。

@構文を使わずに、

    def main():                  # step 1
        print("Hello, world")
    main = staticmethod(main)    # step 2

としても同じです。どちらにしても、メソッド本体に記述したコードの断片を実行します。

《Note》コンストラクター staticmethod の実引数に instancemethod オブジェクト main を指定して、そのリターン値(クラス staticmethod のインスタンス)を、クラス属性 main に割り当てたことになります。すると、クラス属性 main は、関数(メソッド)定義したときの instancemethod オブジェクトに代えて、生成したばかりの staticmethod オブジェクトに束縛されます。


生成したばかりのインスタンス HelloWorld() です。すると、メソッド本体に記述されたコードの断片を実行します。

■ 事例:classmethod

Python2.2 以降では、classmethod を利用できます。

class HelloWorld3:
    @classmethod
    def main(self):
        print("Hello, world")
        print(self.__name__)

>>> HelloWorld3.main()
Hello, world
HelloWorld3

メソッド呼び出しのときに割り当てられる引数 self を介して(インスタンスを介さずに)クラスを参照できます。

@構文を使わずに、

    def main():                  # step 1
        print("Hello, world")
    main = classmethod(main)     # step 2

としても同じです。どちらにしても、メソッド本体に記述したコードの断片を実行します。

その代わり、を生成せずに、クラス名に続くメソッド呼び出しが可能になります。


》作業中です《

>>> type(main)

>>> type(HelloWorld.main)

>>> type(HelloWorld2.main)

>>> type(HelloWorld2a.main)

>>> type(HelloWorld3.main)

>>> x = staticmethod(main)
>>> type(x)

>>> x = classmethod(main)
>>> type(x)

$ jython2.5.0 -i hello.py 
 -------------------- function
Hello, world
 -------------------- method
Hello, world
HelloWorld
 -------------------- staticmethod
Hello, world
Hello, world
 -------------------- classmethod
Hello, world
HelloWorld3
 -------------------- __main__
Hello, world

Tips

》作業中です《

Last updated♪2009/07/20