クラスC
を宣言していて、いくつかの宣言が非常に似ているとします。f
これらの宣言のコードの繰り返しを減らす関数を使用したいと思います。f
いつものように宣言して使用することができます:
>>> class C(object):
... def f(num):
... return '<' + str(num) + '>'
... v = f(9)
... w = f(42)
...
>>> C.v
'<9>'
>>> C.w
'<42>'
>>> C.f(4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method f() must be called with C instance as first argument (got int instance instead)
おっとっと!私はうっかりf
外の世界にさらされてしまいましたが、それはself
議論を必要としません (そして、明らかな理由でできません)。1つの可能性はdel
、私がそれを使用した後の関数です:
>>> class C(object):
... def f(num):
... return '<' + str(num) + '>'
... v = f(9)
... del f
...
>>> C.v
'<9>'
>>> C.f
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'C' has no attribute 'f'
f
しかし、宣言後に後でもう一度使用したい場合はどうすればよいですか? 関数を削除しても意味がありません。私はそれを「非公開」にして (つまり、その名前の前に を付けて__
)処理することもできますが、異常なチャネルを介してオブジェクトを@staticmethod
呼び出すと非常にファンキーになります。staticmethod
>>> class C(object):
... @staticmethod
... def __f(num):
... return '<' + str(num) + '>'
... v = __f.__get__(1)(9) # argument to __get__ is ignored...
...
>>> C.v
'<9>'
staticmethod
記述子であるオブジェクト自体は呼び出し可能ではないため、上記の狂気を使用する必要があります。staticmethod
オブジェクトを呼び出す前に、オブジェクトによってラップされた関数を回復する必要があります。
これを行うためのより良い方法が必要です。クラスで関数をきれいに宣言し、宣言中に使用し、後でクラス内から使用するにはどうすればよいですか? 私もこれをしなければなりませんか?