私は良いデザインがあるのかどうかは分かりませんが、unittest.TestCaseから派生したクラスがあります。それを設定したら、私のコードはunittestを実行する前に、test_*
メソッドをクラスに動的に注入します。私はこれにsetattr
を使用します。これはうまくいっていますが、私は前に注入したメソッドを削除し、新しいメソッドセットを注入したいという状況があります。名前がパターンtest_*
と一致するクラスのすべてのメソッドを削除するにはどうすればよいですか?Python - クラスからメソッドを動的に削除するにはどうすればいいですか?つまり、setattrの反対側です。
5
A
答えて
14
delattr
といい、hereと記載されています。
3
>>> class Foo:
def func(self):
pass
...
>>> dir(Foo)
['__doc__', '__module__', 'func']
>>> del Foo.func
>>> dir(Foo)
['__doc__', '__module__']
1
delattr()
です。クラスのvars()
をループし、"test_"
で始まる属性名をテストします。例えば、
@classmethod
def remove_test_methods(cls):
for name in list(vars(cls)):
if name.startswith("test_") and callable(getattr(cls, name)):
delattr(cls, name)
は、私はあなたがターゲットとしているクラスに定義されてdir()
から取得するすべての名前を、これは同様にあなたの親クラスからの名前が表示されますよう、dir()
を使用しないことをお勧めし、そうではないと思います。前回の回答に加えとして
0
:削除するメソッドが再実装されている場合は、サブクラスと親クラスのメソッドを削除する必要があるだろう、両方:
class A:
def method(self):
print("TestA")
class B(A):
def method(self):
A.method(self)
print("TestB")
instance = B()
instance.method() # will call B.method()
del B.method
instance.method() # will now call A.method()
del A.method
instance.method() # will now raise AttributeError
(またはdelattr
を使用@ BrenBarnの答え)
関連する問題
- 1. Python matplotlib.pyplot円グラフ:左側のラベルを削除するにはどうすればいいですか?
- 2. クラスの異なるメソッドで重複を削除するにはどうすればよいですか?
- 3. UIImageViewクラスをリリース/削除するにはどうすればよいですか?
- 4. iframeの内側から余分な余白を削除するにはどうすればよいですか?
- 5. Php:アンカータグをページリストの内側から削除するにはどうすればよいですか?
- 6. jQueryを単純なjQueryから削除するにはどうすればいいですか?addClass/removeクラスからjankを削除するには
- 7. javascriptタイプからメソッドを削除するにはどうすればいいですか?
- 8. JavaからScalaオブジェクトのメソッドを反射的に呼び出すにはどうすればよいですか?
- 9. DataTablesからいくつかの要素を削除するにはどうすればよいですか?
- 10. ディスクからファイルを削除せずにファイルを削除するにはどうすればよいですか?
- 11. PythonでJSONから余分な角括弧を削除するにはどうすればよいですか?
- 12. 削除されたファイルからPyDevデバッガブレークポイントを削除するにはどうすればよいですか?
- 13. 1つのjQuery UIウィジェットから丸い角を削除するにはどうすればよいですか?
- 14. Listを含むクラスからListの要素を削除するにはどうすればよいですか?
- 15. 1つのdeleteステートメントで複数の動的に割り当てられた配列を削除するにはどうすればよいですか?
- 16. 動的に生成されたテーブル行を削除するにはどうすればよいですか?
- 17. Python(pygame):行を削除するにはどうしたらいいですか?
- 18. Pythonから対話型プログラム(gdbなど)を起動するにはどうすればよいですか?
- 19. iPhoneでシャドウを削除するにはどうすればいいですか?
- 20. 他のクラスを削除せずにクラスを追加するにはどうすればよいですか?
- 21. イメージの左側にある小さなボーダーを削除するにはどうすればよいですか?
- 22. richfacesコンポーネントからcssクラスを削除するにはどうすればよいですか?
- 23. デフォルトのコンストラクタを削除するにはどうすればいいですか?
- 24. リストから空白を削除するにはどうすればよいですか? Python
- 25. javascript/jqueryでクラスのインスタンスをすべて削除するにはどうすればいいですか?
- 26. 別のレイヤーからシーンからレイヤーを削除するにはどうすればいいですか? (Cocos2d)
- 27. Pythonのオブジェクト(クラスではない)からメソッドを削除することはできますか?
- 28. ファイルを削除できるかどうかを確認するにはどうすればいいですか?
- 29. Python Tkinter - メインウィンドウクラスの外側から変数を変更するにはどうすればいいですか?
- 30. NSMutableArrayからオブジェクトのインスタンスを1つだけ削除するにはどうすればよいですか?
「デル」でも動作しませんか? –
@ JasonSperske:名前がプログラムによって計算される属性を削除する必要がない場合あなたは文字通りソースコードに入力できる名前を削除するのに 'del'だけ使うことができます。 – BrenBarn
@JasonSperske - タイトルは "setattrの反対"と言っています。OPはメソッド名を文字列として認識しています... – mgilson