[解決済み] staticmethod' オブジェクトは呼び出し可能ではない
質問
このようなコードがあります。
class A(object):
@staticmethod
def open():
return 123
@staticmethod
def proccess():
return 456
switch = {
1: open,
2: proccess,
}
obj = A.switch[1]()
これを実行すると、ずっとエラーが出ます。
TypeError: 'staticmethod' object is not callable
どのように解決するのですか?
どのように解決するのですか?
保存している
バインドされていない
staticmethod
オブジェクトを辞書に登録します。このようなオブジェクトは(同様に
classmethod
オブジェクト、関数、および
property
オブジェクト) は
記述子プロトコル
を通してのみ結合され、クラスまたはインスタンスの属性として名前にアクセスすることで結合されます。直接
staticmethod
オブジェクトに直接アクセスすることは、属性アクセスではありません。
辞書を作成するか の後に を作成するか、明示的にバインドするか、元の関数を抽出してから辞書に格納します。
の 'バインド' に注意してください。
staticmethod
オブジェクトの「バインド」とは、単にコンテキストを無視することを意味します。
staticmethod
は基礎となる関数を変更せずに返します。
したがって、選択肢としては、辞書のインデントを解除し、属性を使用して記述子プロトコルを起動することです。
class A(object):
@staticmethod
def open():
return 123
@staticmethod
def proccess():
return 456
A.switch = {
1: A.open,
2: A.proccess,
}
または、ダミーのコンテキストを渡して明示的にバインドすることもできます (これはいずれにせよ無視されます)。
class A(object):
@staticmethod
def open():
return 123
@staticmethod
def proccess():
return 456
switch = {
1: open.__get__(object),
2: proccess.__get__(object),
}
で直接基礎となる関数にアクセスするか
__func__
属性で直接アクセスすることもできます。
class A(object):
@staticmethod
def open():
return 123
@staticmethod
def proccess():
return 456
switch = {
1: open.__func__,
2: proccess.__func__,
}
しかし、もしあなたが行おうとしていることが、単に
名前空間
を提供するだけなら、そもそもクラスオブジェクトを使うべきではないでしょう。関数を
モジュール
. そうすれば
staticmethod
のデコレータを使う必要がなくなり、またアンラップする必要もなくなります。
関連
-
[解決済み] UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] インスタンスのクラス名を取得する?
-
[解決済み] JSONデータをファイルに書き込むにはどうしたらいいですか?
-
[解決済み] Pythonの@propertyデコレーターはどのように機能するのでしょうか?
-
[解決済み] Pythonでリストをタプルに変換する
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] サブフォルダからのインポートモジュール
最新
-
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デコレータ
-
[解決済み】E731 ラムダ式を代入せず、defを使用する。
-
[解決済み] PILからopenCVフォーマットへの変換
-
[解決済み] 辞書のキーと値を交換するにはどうすればよいですか?
-
[解決済み] Pythonのargparseを使った隠し引数の作成
-
[解決済み] DataFrameに日付間の日数カラムを追加する pandas
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] Pythonによる一対のクロスプロダクト [重複] (英語)
-
[解決済み] Python Empty Generator 関数