我不知道我这里是否有一个好的设计,但是我有一个派生自 unittest.TestCase 的类以及我设置它的方式,我的代码将在调用 unittest 之前动态地将一堆test_*
方法注入到类中穿过它。我用setattr
这个。这一直运作良好,但现在我有一种情况,我想删除我之前注入的方法并注入一组新的方法。如何删除名称与模式匹配的类中的所有方法test_*
?
问问题
16327 次
4 回答
26
它被称为delattr
并记录在这里。
于 2013-05-22T20:25:28.880 回答
5
>>> class Foo:
def func(self):
pass
...
>>> dir(Foo)
['__doc__', '__module__', 'func']
>>> del Foo.func
>>> dir(Foo)
['__doc__', '__module__']
于 2013-05-22T20:25:53.280 回答
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()
可能在您的目标类中定义。
于 2013-05-22T20:26:32.810 回答
1
作为对先前答案的补充:如果要删除的方法被重新实现,则必须删除子类和父类方法,两者:
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 的回答)
于 2017-07-19T05:56:28.613 回答