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