我有一个例子如下:
我定义抽象类的第一个脚本:
# 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
方法。
谢谢。
问题是double_underscore属性在Python中有些神奇。
来自docs:
形式__spam的任何标识符(至少两个前导下划线,最多一个尾随下划线)在文本上用_classname__spam替换,其中classname是当前类名,其中前导下划线被剥离。
因此,不是覆盖__foo_1
,而是最终得到一个抽象的_A__foo_1()
和一个实现的_B__foo_1()
好的...我找到了我需要的东西,我只需要将受保护的方法__foo
更改为普通方法foo
,这一切都有效。