我试图创建一个类似于:
的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)
我正在尝试研究如何正确调用构造函数。我拥有它的方式,我很确定我多次调用接口构造函数......所以这是错误的...有没有一种首选的方法呢? (也许我不在接口类中调用构造函数,或者我只在实现类的最后调用接口构造函数。)
此外,我从未编写过这种风格的代码,并且愿意采用更好的方法来编写代码。
答案 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
。元类通过继承传递。