15

我不知道我这里是否有一个好的设计,但是我有一个派生自 unittest.TestCase 的类以及我设置它的方式,我的代码将在调用 unittest 之前动态地将一堆test_*方法注入到类中穿过它。我用setattr这个。这一直运作良好,但现在我有一种情况,我想删除我之前注入的方法并注入一组新的方法。如何删除名称与模式匹配的类中的所有方法test_*

4

4 回答 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 回答