在Python中,有什么方法可以从其父类调用子类的方法重写吗?

时间:2019-06-16 16:04:15

标签: python inheritance polymorphism abstract-class subclass

我试图重新自学Python,并找出有关抽象类和多态性的特定细节,技巧和窍门以及通用约定。现在,我的类层次结构如下所示:

from abc import ABC, abstractmethod


class A(ABC):

    @abstractmethod
    def x(self):
        pass

    def do_x_ten_times(self):
        for i in range(10):
            x()


class B(A):

    def x(self):
        print("Hello World")


class C(A):

    def x(self):
        print("Hello StackOverflow")



b = B()
b.x()

c = C()
c.x()

b.do_x_ten_times()

我的想法是 do_x_ten_times()在两个子类 B C 中将是完全相同的代码。因此,如果我可以将 do_x_ten_times()的代码放在 A 中,然后调用A来调用子类的实现,那将很方便(并且我的代码将不再重复)是 x()的。不幸的是,我收到“ NameError:未定义名称'x'。”

我明白为什么做这样的事情可能并不典型,而我的直觉说这可能违反了某些多态性规则。如果确实需要,可以将 do_x_ten_times()复制到两个类 B C 中,并在 A 。但是我想知道是否有任何合理的方法可以避免重复此代码。

1 个答案:

答案 0 :(得分:3)

您需要在self.x()中致电A.do_x_ten_times()

from abc import ABC, abstractmethod


class A(ABC):

    @abstractmethod
    def x(self):
        raise NotImplementedError

    def do_x_ten_times(self):
        for i in range(10):
            self.x()        # <-- self will refer to the calling instance
                            #     implementation of x(self)


class B(A):

    def x(self):
        print("Hello World")


class C(A):

    def x(self):
        print("Hello StackOverflow")



b = B()
b.x()

c = C()
c.x()

b.do_x_ten_times()