如何检查python类是否具有特定方法?

Nik*_*kar 2 python methods class function

class C(Test):
    def __init__(self):
        print "in C init"
        super(C, self).__init__()

    def setup(self):
        print "\tin C setup"

    def runtest(self):
        print "\t\tin C runtest"

    def teardown(self):
        print "\t\t\tin C teardown"
Run Code Online (Sandbox Code Playgroud)

我在不同的模块中有这样的类。对于如类ABC等等。在一个模块中,我只考虑谁拥有安装和拆卸方法的类。假设 ClassA没有 setup 方法,我不想在我的程序的进一步部分考虑它,我正在构建具有 setup 和 runtest 模块的类列表。有没有我可以使用的python函数?处理这个问题的正确方法是什么?

Gar*_*tty 5

我认为这是一个抽象基类的情况

class Test(metaclass=ABCMeta):
    @abstractmethod
    def setup(self):
        ...

    @abstractmethod
    def teardown(self):
        ...

    @classmethod
    def __subclasshook__(cls, C):
        if cls is Test:
            if (any("setup" in B.__dict__ for B in C.__mro__) and 
               any("teardown" in B.__dict__ for B in C.__mro___)):
                return True
        return NotImplemented
Run Code Online (Sandbox Code Playgroud)

这定义了类型Test,和一个__subclasshook__功能,如果检查一个类定义setup()teardown()。这意味着任何这样的类都将被视为 的子类Test-issubclass()即将返回Truefor issubclass(C, Test)

当然,您可以使用与__subclasshook__函数相同的方法手动进行检查,但抽象基类提供了一种很好(且标准)的方式来定义您想要履行的合同。