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)
我在不同的模块中有这样的类。对于如类A,B,C等等。在一个模块中,我只考虑谁拥有安装和拆卸方法的类。假设 ClassA没有 setup 方法,我不想在我的程序的进一步部分考虑它,我正在构建具有 setup 和 runtest 模块的类列表。有没有我可以使用的python函数?处理这个问题的正确方法是什么?
我认为这是一个抽象基类的情况。
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__函数相同的方法手动进行检查,但抽象基类提供了一种很好(且标准)的方式来定义您想要履行的合同。