【发布时间】:2016-09-20 19:18:54
【问题描述】:
考虑以下代码示例
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 刚刚了解,谢谢 :)
-
@Torxed
str不是变量名。 -
我才意识到,谢谢你让我读了两遍@DonkeyKong :)
-
哦,见鬼 - 如果有人进入源代码,我会很高兴。但这是规范的一部分吗?是否存在需要这种行为的情况?或者它是一个错误,或者只是没有被考虑的案例?
标签: python multiple-inheritance metaclass abstract-methods