以下是我的一个例子:
我定义抽象类的第一个脚本:
# 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-method。
谢谢。
发布于 2018-09-18 12:25:51
问题是double_underscore属性在Python中有些神奇。
来自文档
表单__spam的任何标识符(至少两个前导下划线,最多一个尾随下划线)将文本替换为_classname__spam,其中类名是当前类名,去掉了前导下划线。
因此,与其重写__foo_1,不如使用抽象_A__foo_1()和实现的_B__foo_1()。
发布于 2018-09-18 12:25:34
好吧..。我找到了我需要的东西,我只需要将受保护的方法__foo更改为普通的foo方法,就可以了。
https://stackoverflow.com/questions/52386416
复制相似问题