1. ホーム
  2. パイソン

[解決済み】Pythonのクラスメソッドの違い:バウンド、アンバウンド、スタティック

2022-04-01 23:08:11

質問

次のクラスメソッドの違いは何ですか?

一方は静的で、他方は静的でないということでしょうか?

class Test(object):
  def method_one(self):
    print "Called method_one"

  def method_two():
    print "Called method_two"

a_test = Test()
a_test.method_one()
a_test.method_two()

解決方法は?

Pythonでは、以下のように区別されています。 バウンド アンバウンド メソッドを使用します。

基本的に、メンバー関数の呼び出し(例えば method_one )、バウンド関数

a_test.method_one()

は次のように変換されます。

Test.method_one(a_test)

すなわち、結合されていないメソッドの呼び出しです。そのため、あなたのバージョンの method_two で失敗します。 TypeError

>>> a_test = Test() 
>>> a_test.method_two()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: method_two() takes no arguments (1 given) 

デコレーターを使ってメソッドの動作を変更することができる

class Test(object):
    def method_one(self):
        print "Called method_one"

    @staticmethod
    def method_two():
        print "Called method two"

このデコレーターは、組み込みのデフォルトのメタクラスである type (クラスのクラス、cf. この質問 に対するバインドメソッドを作らないようにするため) method_two .

これで、インスタンス上でもクラス上でも、静的メソッドを直接呼び出すことができるようになりました。

>>> a_test = Test()
>>> a_test.method_one()
Called method_one
>>> a_test.method_two()
Called method_two
>>> Test.method_two()
Called method_two