在python中重写抽象方法时如何限制args

时间:2017-05-13 08:58:55

标签: python

class F(object):
    __metaclass__ = abc.ABCMeta
    @abc.abstractmethod
    def f(self, a, b): print("F")


class FF(F):
    def f(self): print("FF")



f = FF()
f.f()

在这里,我使用两个参数定义了一个抽象方法f。我想限制子类,以便它具有相同的参数,如超类。

怎么做?

2 个答案:

答案 0 :(得分:1)

没有任何简单的方法可以检查方法签名是否匹配。

但是,假设:

  1. 您的子类只派生自相关的抽象类或抽象类是其mro中的第一个
  2. 并且抽象类的实现是空的,以消除任何不需要的结果的可能性,例如将新属性绑定到子类,
  3. 您可以对从子类方法传递参数的抽象方法进行super调用。 调用仅用于强制执行签名匹配。

    class F(object):
        __metaclass__ = abc.ABCMeta
        @abc.abstractmethod
        def f(self, a, b): pass
    
    
    class FF(F):
        def f(self, *args, **kwargs):
            super(FF, self).f(*args, **kwargs)
            ...
    
    f = FF()
    f.f()
    
    Traceback (most recent call last):
      File "python", line 17, in <module>
      File "python", line 12, in f
    TypeError: f() takes exactly 3 arguments (1 given)
    

    Python抽象方法(与其他方法不同)可以有实现,可以通过super调用;所以这可能就是一个用例。

答案 1 :(得分:0)

您可以使用 abcmeta 库:https://github.com/mortymacs/abcmeta .它为您提供了对派生类的更多限制。