接口的ABC继承链中的Python构造函数

时间:2016-03-12 13:13:59

标签: python oop python-3.x

我试图创建一个类似于:

的Python接口类层次结构
class Axis(object, metaclass=ABCMeta):
    def __init__(self):
        # Do stuff...

class LinearAxis(Axis, metaclass=ABCMeta):
    @abstractmethod
    def move_linear(self, move_um):
        pass

    def __init__(self):
        # Do stuff...
        Axis.__init__(self)

class RotationalAxis(Axis, metaclass=ABCMeta):
    @abstractmethod
    def move_rotate(self, move_degree):
        pass

    def __init__(self):
        # Do stuff...
        Axis.__init__(self)

class XAxis(LinearAxis, metaclass=ABCMeta):
    def __init__(self):
        # Do stuff...
        LinearAxis.__init__(self)

所以基本上是一个类似的界面,在任何地方都有更多的函数和构造函数中的东西......

然后我去了我的界面:

class AnAxis(Axis):
    def __init__(self):
        # Do stuff...
        Axis.__init__(self)

class AnLinearAxis(AnAxis, LinearAxis):
    def move_linear(self, move_um):
        pass

    def __init__(self):
        # Do stuff...
        AnAxis.__init__(self)
        LinearAxis.__init__(self)

class AnRotationalAxis(AnAxis, RotationalAxis):
    def move_rotate(self, move_degree):
        pass

    def __init__(self):
        # Do stuff...
        AnAxis.__init__(self)
        RotationalAxis.__init__(self)

class AnXAxis(AnLinearAxis, XAxis):
    def __init__(self):
        # Do stuff...
        AnLinearAxis.__init__(self)
        XAxis.__init__(self)

我正在尝试研究如何正确调用构造函数。我拥有它的方式,我很确定我多次调用接口构造函数......所以这是错误的...有没有一种首选的方法呢? (也许我不在接口类中调用构造函数,或者我只在实现类的最后调用接口构造函数。)

此外,我从未编写过这种风格的代码,并且愿意采用更好的方法来编写代码。

1 个答案:

答案 0 :(得分:2)

您可能正在寻找super()功能。 调用super().something()会调用父类的方法something()。它确保(使用__mro__)仅调用父类的方法一次。

即。你的代码看起来像这样:

class AnLinearAxis(AnAxis, LinearAxis):
    def move_linear(self, move_um):
        pass

    def __init__(self):
        # Do stuff...
        super().__init__()

请记住,您不需要传递self或元类。元类通过继承传递。此外,您不需要多次拨打超级电话。 Super将自动调用所有父类的方法。

关于界面,它看起来不错,但如果您继承的类已经拥有它,则无需传递metaclass=ABCMeta。元类通过继承传递。