Python 具体子类的实例是抽象类的实例吗?

Python 具体子类的实例是抽象类的实例吗?,python,abstract-class,instantiation,Python,Abstract Class,Instantiation,根据定义,我们不能实例化抽象类: 导入abc >>>A类(abc.abc): ... @抽象方法 ... def f(自身):升起未执行错误 ... >>>() 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:无法用抽象方法f实例化抽象类A 那么,一个具体子类的实例是抽象类的实例,这不是一个矛盾吗 >>B类(A): ... def f(self):返回“foo” ... >>>isinstance(B(),A) 真的 作为类实例的对象和实例

根据定义,我们不能实例化抽象类:

导入abc >>>A类(abc.abc): ... @抽象方法 ... def f(自身):升起未执行错误 ... >>>() 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:无法用抽象方法f实例化抽象类A 那么,一个具体子类的实例是抽象类的实例,这不是一个矛盾吗

>>B类(A):
...     def f(self):返回“foo”
... 
>>>isinstance(B(),A)
真的

作为类实例的对象和实例化类的行为之间有区别。继承意味着,如果
B
a
的子类,那么
isinstance(B(),a)
是真的,即使被实例化的类是
B
,而不是
a

如果您永远无法具体化抽象类,那么首先定义抽象类就没有意义了。抽象类的目的是为其他类提供不完整的模板;您不能简单地按原样使用抽象类,而不做一些额外的定义


换句话说,给定
b=b()
b
A
b
的实例,但只有
b
b
的类型。Is type of和Is instance of是两种不同的关系。

我认为它是一个实例,因为它确实遵循抽象类的蓝图,即可以被视为抽象类型类(从而启用多态性)。例如,这类似于java中的接口。如果您不能创建接口实例,但可以从实现它的类创建对象,从而可以像使用接口类型一样使用它,我同意,我的困惑来自这样一个事实:抽象类不能实例化,但可以有实例。我意识到实际上没有矛盾:无法实例化意味着无法创建实例,而不是实例无法创建。抽象类实例仍然可以由具体的子类创建。