一連の文字列から、クラス内のメソッドを呼び出そうとしています。 残念ながら、このメソッドはクラスの内部であることを示すためにself
が必要なため、正しく呼び出されません。どうすればその論理を修正できますか?一連の文字列からクラス内のメソッドを呼び出す
class SomeClass(object):
def apply(self):
rules = [{'action': 'replace'}, {'action': 'split'}, {'action': 'remove'}]
return [eval('_perform_' + r['action'])() for r in rules
if r['action'] in ['replace', 'split', 'remove']]
def _perform_replace(self):
print("performing replace")
def _perform_split(self):
print("performing split")
def _perform_remove(self):
print("performing remove")
SomeClass().apply()
これは、次の例外がスローされます。
NameError: name '_perform_replace' is not defined
'staticmethods'にアクセスするには、クラスを静的メンバー関数として定義するために' decorater'を使う必要があります。そして '()'を除いて 'SomeClass.apply()'のように呼びます。さらに、Pythonで文字列を分割/エスケープしようとすると、あなたがしようとしているものよりはるかに簡単な方法があります。 – user1767754
詳しいことはありますか?私は単純な方法があることを知っていますが、ここで私の 'rules'リストは実際にいくつかのドメイン特有の規則を持つjsonファイルです。 - 置き換え/分割/削除はより関与しており、パンダのデータフレームとのやりとりが必要です。私は自分の問題の核心に集中するように説明しなかった。 – Michael
getattrを使用してオブジェクトの属性のようなメソッドにアクセスできます。あなたのapplyメソッドの中から 'getattr(self、 '_perform_' + r ['action'])()' – antonagestam