擅长:python、mysql、java
<p>这就是我认为正在发生的事情。在</p>
<p>当您尝试实例化<code>Child1</code>时,您没有为抽象属性<code>name</code>提供实现。你可能是这样做的:</p>
<pre><code>class Child1(Parent):
@property
def name(self):
return "foo"
</code></pre>
<p>由于该类没有为从其父类继承的所有抽象方法提供实现,因此它本身实际上是一个抽象类,因此不能实例化。尝试实例化它会给您<code>TypeError</code>。在</p>
<p>在<code>Child2</code>的情况下,将其定义为:</p>
^{pr2}$
<p>在本例中,<em>重写了类的<code>name</code>属性,因此它不再引用需要实现的抽象属性。这意味着<code>Child2</code>不是抽象的,可以实例化。在</p>
<p>我注意到的一个区别是,当<code>name = 'test'</code>实现它时,<code>vars(Child2)</code>返回如下输出:</p>
^{3}$
<p>但是,当您将其更改为<code>foo = 'test'</code>之类的内容时,您将得到:</p>
<pre><code>{..., '__abstractmethods__': frozenset({'name'}), ..., 'foo': 'test'}
</code></pre>
<p>请注意,<code>__abstractmethods__</code>属性在您定义<code>name = 'test'</code>的情况下是一个空集,即当<code>Child2</code>可以实例化时。在</p>
<p>最后,在<code>Child3</code>的情况下,您必须记住抽象属性是作为<em>类本身的属性存储的,您不会在任何地方重新定义它。在</p>
<p>一旦您尝试创建它的实例,解释器就会发现它缺少至少一个抽象方法的实现,并抛出您看到的<code>TypeError</code>。它甚至没有到达构造函数中的赋值<code>self.name = 'test'</code>。在</p>
<hr/>
<p>第二部分是关于如何在抽象属性/方法可以像您那样做的时候,如何强制<em>子级始终为抽象属性/方法提供一个实现,我并不确定这是否可能。Python是一种成年人同意的语言。在</p>