我不知道这里是否有一个好的设计,但是我有一个派生自unittest.TestCase的类和我设置它的方式,我的代码将动态地注入一堆test_*
在调用unittest运行之前进入类的方法。我为此使用了setattr
。这一直运行良好,但现在我有一种情况,我想删除我之前注入的方法并注入一组新的方法。如何删除名称与模式test_*
匹配的类中的所有方法?
答案 0 :(得分:18)
它被称为delattr
,并记录在案here。
答案 1 :(得分:3)
>>> class Foo:
def func(self):
pass
...
>>> dir(Foo)
['__doc__', '__module__', 'func']
>>> del Foo.func
>>> dir(Foo)
['__doc__', '__module__']
答案 2 :(得分: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()
获得的所有名称都不会在您定位的课程中定义
答案 3 :(得分: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
(或使用@ BrenBarn答案的delattr