擅长:python、mysql、java
<p>你有两个问题:</p>
<ol>
<li>双下划线属性名调用<em>“name mangling”</em>,因此,例如<code>__hp</code>变成{<cd2>}(参见例如<a href="https://www.python.org/dev/peps/pep-0008/#designing-for-inheritance" rel="nofollow noreferrer">the style guide on inheritance</a>)。在</li>
<li>在<code>check_hasattr</code>中,检查<code>Avatar</code>,<em>类</em>的属性,而不是<code>self</code>,<em>实例</em>。在</li>
</ol>
<p>这将起作用:</p>
<pre><code>class Avatar:
def __init__(self, HP=100, damage=10, defends=10, magic=5):
self.__hp = HP
self.__dam = damage
self.__def = defends
self.__mag = magic
def check_hasattr(self):
print hasattr(self, '_Avatar__hp')
</code></pre>
<p>但是,不需要保护对这些属性的访问(如果有,您应该使用<code>@property</code>而不是名称混乱);请参见例如<a href="https://stackoverflow.com/q/7456807/3001761">Python name mangling</a></p>
<p>还要注意,<code>Class.method(instance)</code>可以重写为<code>instance.method()</code>。不过,在这种情况下,最简单的方法是完全删除该方法,只调用<code>hasattr(warrior, '_Avatar__hp')</code>。在</p>