4
考慮下面的代碼示例與其他基類蟒蛇abstractmethod打破了抽象功能
import abc
class ABCtest(abc.ABC):
@abc.abstractmethod
def foo(self):
raise RuntimeError("Abstract method was called, this should be impossible")
class ABCtest_B(ABCtest):
pass
test = ABCtest_B()
這正確地引發錯誤:
Traceback (most recent call last):
File "/.../test.py", line 10, in <module>
test = ABCtest_B()
TypeError: Can't instantiate abstract class ABCtest_B with abstract methods foo
然而當ABCtest
子類也從一個內建類型一樣繼承str
或list
沒有錯誤,並且test.foo()
調用抽象方法:
class ABCtest_C(ABCtest, str):
pass
>>> test = ABCtest_C()
>>> test.foo()
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
test.foo()
File "/.../test.py", line 5, in foo
raise RuntimeError("Abstract method was called, this should be impossible")
RuntimeError: Abstract method was called, this should be impossible
這似乎發生在從C中定義的任何類繼承,包括itertools.chain
和numpy.ndarray
,但仍然正確地引發了在python中定義的類的錯誤。爲什麼要實現內置類型之一會破壞抽象類的功能?
@DonkeyKong(或任何其他人沒有得到它)方法'foo'應該被強制覆蓋在一個子類中,通常(並且沒有從'str'繼承)實例化它會產生一個錯誤,但是當也從'str'繼承,沒有發生錯誤,抽象方法'test.foo'是一個有效的可調用方法。 –
@ TadhgMcDonald-Jensen剛剛抓住了,謝謝:) – miradulo
@Torxed'str'不是一個變量名。 – miradulo