簡體   English   中英

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

[英]python - non-abstract method calls abstract methods

我在下面有一個例子:

我定義抽象類的第一個腳本:

# 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 中有點神奇。

文檔

任何 __spam 形式的標識符(至少兩個前導下划線,最多一個尾隨下划線)在文本上替換為 _classname__spam,其中 classname 是當前類名,去掉了前導下划線。

因此,而不是覆蓋__foo_1 ,您最終會得到一個抽象的_A__foo_1()和一個已實現的_B__foo_1()

好的...我找到了我需要的東西,我只需要將受保護的方法__foo更改為普通方法foo就可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM