[解決済み】クラスのstaticmethodをクラス本体内で呼び出す?
2022-04-11 08:22:24
質問
クラス本体からスタティック・メソッドを使用しようとし、そのスタティック・メソッドを組み込みの
staticmethod
関数をデコレータとして使用すると、このようになります。
class Klass(object):
@staticmethod # use as decorator
def _stat_func():
return 42
_ANS = _stat_func() # call the staticmethod
def method(self):
ret = Klass._stat_func() + Klass._ANS
return ret
以下のようなエラーが発生します。
Traceback (most recent call last):
File "call_staticmethod.py", line 1, in <module>
class Klass(object):
File "call_staticmethod.py", line 7, in Klass
_ANS = _stat_func()
TypeError: 'staticmethod' object is not callable
なぜこのようなことが起こるのか理解できた(ディスクリプターバインディング)
を手動で変換することで、回避することができます。
_stat_func()
を最後に使用した後、次のように staticmethod に変換します。
class Klass(object):
def _stat_func():
return 42
_ANS = _stat_func() # use the non-staticmethod version
_stat_func = staticmethod(_stat_func) # convert function to a static method
def method(self):
ret = Klass._stat_func() + Klass._ANS
return ret
そこで質問なのですが。
これを達成するための、よりクリーンな、あるいはより "Pythonic" な方法はあるのでしょうか?
どのように解決するのですか?
staticmethod
オブジェクトは、どうやら
__func__
属性に、元の生の関数が格納されます(そうしなければならなかったことは理にかなっています)。だから、これはうまくいくだろう。
class Klass(object):
@staticmethod # use as decorator
def stat_func():
return 42
_ANS = stat_func.__func__() # call the staticmethod
def method(self):
ret = Klass.stat_func()
return ret
余談ですが、staticmethodオブジェクトには、元の関数を保存する何らかの属性があるのではないかと思っていましたが、具体的なことは分かりませんでした。魚を与えるのではなく、釣りを教えるという精神で、私が調査してそれを見つけるために行ったことです(PythonセッションからのC&P)。
>>> class Foo(object):
... @staticmethod
... def foo():
... return 3
... global z
... z = foo
>>> z
<staticmethod object at 0x0000000002E40558>
>>> Foo.foo
<function foo at 0x0000000002E3CBA8>
>>> dir(z)
['__class__', '__delattr__', '__doc__', '__format__', '__func__', '__get__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
>>> z.__func__
<function foo at 0x0000000002E3CBA8>
対話型セッションでの同様の掘り起こし(
dir
このような疑問は、すぐに解決できることが多いです。
関連
-
Pythonの学習とデータマイニングのために知っておくべきターミナルコマンドのトップ10
-
[解決済み】Flaskのテンプレートが見つからない【重複あり
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] リスト内のアイテムのインデックスを検索する
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み】__str__と__repr__の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PythonによるLeNetネットワークモデルの学習と予測
-
python call matlab メソッドの詳細
-
python string splicing.join()とsplitting.split()の説明
-
pythonサイクルタスクスケジューリングツール スケジュール詳解
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み】Django: ImproperlyConfigured: SECRET_KEY 設定は空であってはならない
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です