Python - 如何从类中动态删除方法 - 即与setattr相反

时间:2013-05-22 20:24:13

标签: python setattr

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

4 个答案:

答案 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