非抽象方法调用抽象方法

时间:2018-09-18 12:17:24

标签: python abstract-class

我在下面有一个例子:

我定义抽象类的第一个脚本:

# test.py

from abc import ABCMeta, abstractmethod


class A:
    __metaclass__ = ABCMeta

    def __init__(self, a):
        self.x = a
        self.y = 0

    @abstractmethod
    def __foo_1(self):
        pass

    @abstractmethod
    def __foo_2(self):
        pass

    # that is what i'm wondering if it could be possible
    def run(self):
        self.__foo_1()
        self.__foo_2()

第二个脚本中我实现了抽象方法:

# test2.py

from test import A


class B(A):
    def __foo_1(self):
        self.y += 1

    def __foo_2(self):
        self.y += 2

由于我确定必须按该顺序调用__foo_1__foo_2,因此我想编写非抽象方法run来做到这一点(就像在{{1 }})。但这似乎不起作用:

test.py

反正有这样做吗?由于我不想每次都重写相同的b = B(1) b.run() >> TypeError: Can't instantiate abstract class B with abstract methods _A__foo_1, _A__foo_2 方法。

谢谢。

2 个答案:

答案 0 :(得分:1)

问题在于double_underscore属性在Python中有些神奇。

来自docs

  

任何形式的__spam标识符(至少两个下划线,   在文字上最多替换一个结尾的下划线)   _classname__spam,其中classname是当前的类名,其中前导下划线被去除。

因此,您没有覆盖__foo_1,而是得到了抽象的_A__foo_1()和实现的_B__foo_1()

答案 1 :(得分:0)

好吧……我找到了我需要的东西,我只需要将受保护的方法__foo更改为普通方法foo,一切都可以。