Python - 如何动态从类中删除方法 - 即相反于's'

2024-06-16 11:40:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 方法代码test名称方式情况动态unittest
3条回答
>>> class Foo:
    def func(self):
        pass
...     
>>> dir(Foo)
['__doc__', '__module__', 'func']
>>> del Foo.func
>>> dir(Foo)
['__doc__', '__module__']

它被称为delattr,并被记录为here

delattr()就是你想要的。循环遍历类的vars(),并测试以"test_"开头的属性名。E、 g

@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()获得的名称都可以在目标类上定义。

相关问题 更多 >