python - 非抽象方法调用抽象方法

问题描述 投票:2回答:2

我有一个例子如下:

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

# 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来做那个(就像在test.py中)。但它似乎不起作用:

b = B(1)
b.run()

>> TypeError: Can't instantiate abstract class B with abstract methods _A__foo_1, _A__foo_2

反正有吗?因为我不想每次都重写相同的run方法。

谢谢。

python abstract-class
2个回答
1
投票

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

来自docs

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

因此,不是覆盖__foo_1,而是最终得到一个抽象的_A__foo_1()和一个实现的_B__foo_1()


0
投票

好的...我找到了我需要的东西,我只需要将受保护的方法__foo更改为普通方法foo,这一切都有效。

© www.soinside.com 2019 - 2024. All rights reserved.