如何检查是否蟒蛇类有特殊的方法或没有?(How to check if a python class

2019-10-20 16:49发布

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"

我有这样的班在不同的模块。 对于如类ABC等。在一个模块中,我只考虑谁拥有安装和拆卸方法的类。 假设类A没有设置方法,我不想考虑为我的节目里我建立具有设置和模块的runTest类名单的进一步PARTH。 有没有我可以使用相同的任何Python函数? 什么是解决这个问题的正确方法是什么?

Answer 1:

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

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

这定义了类型Test__subclasshook__来检查,如果一个类定义功能setup()teardown() 这意味着任何这样的类将作为一个子类被处理Test -即issubclass()将返回Trueissubclass(C, Test)

当然,你可能只是做检查使用同样的方法为手动__subclasshook__功能,但抽象基类提供了一个很好的(标准)的方式来定义要履行合同。



Answer 2:

您可以使用hasattrcallable的类本身(类毕竟对象),即像

if hasattr( C, 'setup' ) and callable( C.setup ):
      classes_with_setup.append(C)

或者,在列表理解方面

classes_with_setup=[ U for U in [A,B,C...] if hasattr(U,'setup') and callable(U.setup)]

设置你的这些功能类别列表。

这种方法确实检测继承:

In [1]: class A(object):
   ...:     def f(self):
   ...:         print 'hi'
   ...:         

In [2]: class B(A):
   ...:     pass
   ...: 

In [3]: hasattr(A,'f')
Out[3]: True

In [4]: hasattr(B,'f')
Out[4]: True

In [5]: hasattr(B,'f') and callable(B.f)
Out[5]: True


Answer 3:

您可以使用getattrcallable方法

setup_method = getattr(your_object, "setup_method", None)
if callable(setup_method):
    setup_method(self.path.parent_op)

首先检查对象有一个名为“属性setup_method ”,然后检查该属性是一个方法,然后调用它。



文章来源: How to check if a python class has particular method or not?