<p>文件不鼓励,文件只是说明显而易见的。<code>hasattr</code>就是这样实现的,从属性getter抛出一个<code>AttributeError</code>可以使它看起来像属性不存在。这是一个重要的细节,这就是为什么它会在文档中明确说明。例如,考虑以下代码:</p>
<pre><code>class Spam(object):
sausages = False
@property
def eggs(self):
if self.sausages:
return 42
raise AttributeError("No eggs without sausages")
@property
def invalid(self):
return self.foobar
spam = Spam()
print(hasattr(Spam, 'eggs'))
print(hasattr(spam, 'eggs'))
spam.sausages = True
print(hasattr(spam, 'eggs'))
print(hasattr(spam, 'invalid'))
</code></pre>
<p>结果是</p>
<pre><code>True
False
True
False
</code></pre>
<p>即<code>Spam</code>类有一个<code>eggs</code>的属性描述符,但是由于getter引发了<code>AttributeError</code>,如果<code>not self.sausages</code>,则该类的实例不会“<code>hasattr</code>”<code>eggs</code>”。</p>
<p>除此之外,仅当您不需要该值时才使用<code>hasattr</code>;如果您需要该值,请使用带2个参数的<code>getattr</code>,并捕获异常或3个参数,第三个参数是合理的默认值。</p>
<p>使用<code>getattr()</code>(2.7.9)的结果:</p>
<pre><code>>>> spam = Spam()
>>> print(getattr(Spam, 'eggs'))
<property object at 0x01E2A570>
>>> print(getattr(spam, 'eggs'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in eggs
AttributeError: No eggs without sausages
>>> spam.sausages = True
>>> print(getattr(spam, 'eggs'))
42
>>> print(getattr(spam, 'invalid'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 10, in invalid
AttributeError: 'Spam' object has no attribute 'invalid'
>>>
</code></pre>