Java/Python 導入ガイド:《余録》staticmethod/classmethod
Java プログラマーのための Python 導入ガイド〈初級/入門編〉《Jython2.5》
《余録》staticmethod/classmethod
世界一有名かつ短いプログラム
■ 事例:
メソッド呼び出しのときに割り当てられる(実行時に確定する)引数 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
》作業中です《