首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非抽象方法调用抽象方法

非抽象方法调用抽象方法
EN

Stack Overflow用户
提问于 2018-09-18 12:17:23
回答 2查看 265关注 0票数 2

以下是我的一个例子:

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

代码语言:javascript
复制
# 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()

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

代码语言:javascript
复制
# 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中那样)。但这似乎行不通:

代码语言:javascript
复制
b = B(1)
b.run()

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

有这样的事吗?因为我不想每次都重写相同的run-method。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-18 12:25:51

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

来自文档

表单__spam的任何标识符(至少两个前导下划线,最多一个尾随下划线)将文本替换为_classname__spam,其中类名是当前类名,去掉了前导下划线。

因此,与其重写__foo_1,不如使用抽象_A__foo_1()和实现的_B__foo_1()

票数 1
EN

Stack Overflow用户

发布于 2018-09-18 12:25:34

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52386416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档