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