![](/img/trans.png)
[英]How to dynamically make an existing non-abstract django model, abstract?
[英]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.